# Lua link error: Nicht definierter Verweis auf `lua_close(lua_State*)'



## pointhi (3. November 2013)

Hy,

ich schreibe gerade eine Bibliotek zur sensorverwaltung, in der ich auch Lua-Skripte nutzen kann. Jetzt kommt aber bereits im einfachsten Fall ein fehler, wenn ich die Biblotek einbinde (die Bibliotek ist aber fehlerfrei kompiliert ist)

Hier mal der derzeit einzige lua-code in der Anwendung:

Gelinkt werden in die Bibliotek tinyxml2, lua5.2 und luabind, wobei tinyxml2 nie probleme verursacht hat. In den Header-Dateien gibt es keinerlei #includes die zu externen biblioteken führen (alles wenn nötig forwärtsdeklariert).


```
#include <tinyxml2.h>
#include <lua5.2/lua.h>
#include <luabind/luabind.hpp>


#include "../../include/lua/OssLuaSensorScript.hpp"

namespace oss {
    namespace lua {

        LuaSensorScript::LuaSensorScript() {
            // Create a new lua state
            this->LuaState = luaL_newstate();
            luabind::open(this->LuaState);
        }

        LuaSensorScript::LuaSensorScript(const LuaSensorScript& orig) {
        }

        LuaSensorScript::~LuaSensorScript() {
            // Close a new lua state
            lua_close(this->LuaState);
        }
// ...
```

Wenn ich jetzt aber ein einfaches Programm compilieren möchte, welche diese Bibliotek nutzt kommt der Fehler:


```
*.../OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_close(lua_State*)'
```

Google hat mir leider nicht geholfen, und ich hab auch keine ahnung was falsch laufen könnte.

Der Fehler tritt erst auf wenn ich die Zeile lua_close(this->LuaState); hinzufüge, bzw. wenn ich andere Lua/Luabind Funktionen anfange zu nutzen.

mfg, pointhi


----------



## Kachelator (3. November 2013)

Hi, ich kenne mich mit dieser Lua-Version nicht aus und weiß auch nix über Linux, aber das klingt für mich so, als ob der Linker Probleme hat, lua_close() zu finden. Hast du daran gedacht, alle nötigen Lua-Libs zum Linken anzugeben?


----------



## pointhi (3. November 2013)

Wird gelinkt:


```
-ltinyxml2 -llua5.2 -lluabind
```

Wenn es so ein einfacher fehler wäre, wäre es für mich kein problem mehr. Sogar im projekt, welches die Bibliotek nutzt hab ich die gleichen biblioteken noch einmal gelinkt. Hat aber nichts gebracht.

mfg, pointhi


----------



## Kachelator (3. November 2013)

Schade, dass ich da nicht so im Thema bin. Aber mal eine Frage: Warum verwendest du eigentlich zum Öffnen des Lua-States _luabind:pen()_ und zum Schließen _lua_close()_? Das wirkt merkwürdig. Müsste es nicht eher ein _luabind::close()_ sein?

Nachbemerkung: Guck mal nach, im welchem Namespace _lua_close()_ steckt.


----------



## pointhi (3. November 2013)

So wie es aussieht passt das schon: http://blog.nuclex-games.com/tutorials/cxx/luabind-introduction/, ich muss aber auch sagen, dass ich mit luabind noch nie gearbeitet habe, nur ein paar testprogramme mit lua an sich. Und die Bibliotek compiliert ja auch, nur nicht das einbinder die Bibliotek in ein neues Projekt funktioniert nicht mehr.

mfg, pointhi


----------



## Kachelator (3. November 2013)

Ich habe mir das Tutorial mal angesehen -- sieht alles gut aus. Ich glaube immer noch, dass es am Linker liegt und das er Probleme hat, die Lua- (nicht Luabind-) Lib zu finden. 

Tut mir Leid, dass ich dir da im Moment nicht weiterhelfen kann! 

PS: Vergiss meine Namespace-Anmerkung: Falls da was falsch wäre, würde bereits der Compiler meckern.


----------



## deepthroat (4. November 2013)

Hi.

Vermutlich liegt das an der Reihenfolge in der du die Bibliotheken auf der Kommandozeile angegeben hast.

Zeig mal den vollständigen Befehl.


----------



## pointhi (4. November 2013)

Das ist der Befehl der die ganzen Bibliotek linkt:


```
g++     -o dist/Debug/GNU-Linux-x86/libOpenSensorSystem.so build/Debug/GNU-Linux-x86/_ext/1288313479/OssRootNode.o build/Debug/GNU-Linux-x86/_ext/1288313479/OssSpecialFunctions.o build/Debug/GNU-Linux-x86/_ext/1288313479/OssTree.o build/Debug/GNU-Linux-x86/_ext/1303538962/I2cHost.o build/Debug/GNU-Linux-x86/_ext/1303538962/I2cSlave.o build/Debug/GNU-Linux-x86/_ext/1303538962/I2cSmbSlave.o build/Debug/GNU-Linux-x86/src/OssGroups.o build/Debug/GNU-Linux-x86/src/lua/LuaSensorScript.o build/Debug/GNU-Linux-x86/src/sensor/OssSensor.o -ltinyxml2 -llua5.2 -lluabind -shared -fPIC
```

außer die Biblioteken hinzuzufügen hab ich nichts daran geändert. (Meine IDE ist NetBeans, was aber vermutlich unwichtig ist).


Das ist die Ausgabe beim linken des Testprogrammes, also das die Bibliotek nutzten soll:


```
g++     -o dist/Debug/GNU-Linux-x86/sensorsystemtest build/Debug/GNU-Linux-x86/main.o -Wl,-rpath,/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86 -L/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86 -lOpenSensorSystem -llua5.2 -lluabind
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_close(lua_State*)'
collect2: error: ld returned 1 exit status
```
 Hier sind auch noch einmal die beiden lua-libs gebunden, was aber nichts geholfen hat.

Die Ganze bibliotek ist übrigens OS. Hier die Datei, die Befehle die nicht funktionieren sind auskommentiert: https://github.com/pointhi/OpenSensorSystem/blob/master/src/lua/LuaSensorScript.cpp#L39

Mein Testcode linkt bereits nicht mehr, wenn 1. Klasse der Bibliotek genutzt wird:

```
// Testprogramm
#include <iostream>
#include <string>
#include <tr1/memory>

#include "OpenSensorSystem.hpp"

int main(int argc, char** argv) {
    oss::Root Sensorsystems; // Das reicht bereits, das das linken fehlschlägt, ohne lua-code funktioniert jedoch alles fehlerfrei
// ...
}
```

mfg, pointhi


----------



## deepthroat (4. November 2013)

Und der Code ist der in Beitrag #1 gezeigte? Du verwendest also luaL_newstate und lua_close, aber nur lua_close wird als nicht definiert bemängelt?

Was ist die Ausgabe von:

```
nm -D /home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so | grep lua
```
?


----------



## pointhi (4. November 2013)

Genau, so ist es. Hier ist die ausgabe:


```
U luaL_newstate
                 U _Z9lua_closeP9lua_State
0000000000013a60 W _ZN3oss3i2c5Slave12AddChildNodeENSt3tr110shared_ptrINS_3lua8LuaGroupEEE
0000000000013cf0 W _ZN3oss3i2c5Slave15RemoveChildNodeENSt3tr110shared_ptrINS_3lua8LuaGroupEEE
00000000000163d0 W _ZN3oss3lua15LuaSensorScript12AddChildNodeENSt3tr110shared_ptrINS_10helpGroups17LuaAndSensorGroupEEE
0000000000016660 W _ZN3oss3lua15LuaSensorScript15RemoveChildNodeENSt3tr110shared_ptrINS_10helpGroups17LuaAndSensorGroupEEE
00000000000159c0 T _ZN3oss3lua15LuaSensorScript7InitLuaEv
0000000000015a40 T _ZN3oss3lua15LuaSensorScript7RunNodeEv
0000000000015b10 T _ZN3oss3lua15LuaSensorScript8parseXmlEPN8tinyxml27XMLNodeE
00000000000159b0 T _ZN3oss3lua15LuaSensorScript9InitChildEv
0000000000015ae0 T _ZN3oss3lua15LuaSensorScriptC1ERKS1_
0000000000015a80 T _ZN3oss3lua15LuaSensorScriptC1Ev
0000000000015ae0 T _ZN3oss3lua15LuaSensorScriptC2ERKS1_
0000000000015a80 T _ZN3oss3lua15LuaSensorScriptC2Ev
0000000000015a20 T _ZN3oss3lua15LuaSensorScriptD0Ev
00000000000159d0 T _ZN3oss3lua15LuaSensorScriptD1Ev
00000000000159d0 T _ZN3oss3lua15LuaSensorScriptD2Ev
0000000000015490 T _ZN3oss3lua8LuaGroupD0Ev
0000000000015470 T _ZN3oss3lua8LuaGroupD1Ev
0000000000015470 T _ZN3oss3lua8LuaGroupD2Ev
00000000000163a0 W _ZN7luabind12value_vectorD0Ev
0000000000016370 W _ZN7luabind12value_vectorD1Ev
0000000000016370 W _ZN7luabind12value_vectorD2Ev
                 U _ZN7luabind4openEP9lua_State
00000000000139f0 W _ZNSt3tr121_Sp_counted_base_implIPN3oss3lua15LuaSensorScriptENS_11_Sp_deleterIS3_EELN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv
0000000000013a30 W _ZNSt3tr121_Sp_counted_base_implIPN3oss3lua15LuaSensorScriptENS_11_Sp_deleterIS3_EELN9__gnu_cxx12_Lock_policyE2EE14_M_get_deleterERKSt9type_info
0000000000013a10 W _ZNSt3tr121_Sp_counted_base_implIPN3oss3lua15LuaSensorScriptENS_11_Sp_deleterIS3_EELN9__gnu_cxx12_Lock_policyE2EED0Ev
00000000000139e0 W _ZNSt3tr121_Sp_counted_base_implIPN3oss3lua15LuaSensorScriptENS_11_Sp_deleterIS3_EELN9__gnu_cxx12_Lock_policyE2EED1Ev
00000000000139e0 W _ZNSt3tr121_Sp_counted_base_implIPN3oss3lua15LuaSensorScriptENS_11_Sp_deleterIS3_EELN9__gnu_cxx12_Lock_policyE2EED2Ev
000000000021cad0 V _ZTIN3oss3lua15LuaSensorScriptE
000000000021c640 V _ZTIN3oss3lua8LuaGroupE
000000000021caa0 V _ZTIN7luabind12value_vectorE
000000000021c300 V _ZTINSt3tr121_Sp_counted_base_implIPN3oss3lua15LuaSensorScriptENS_11_Sp_deleterIS3_EELN9__gnu_cxx12_Lock_policyE2EEE
000000000021ca40 V _ZTISt12_Vector_baseIN7luabind5valueESaIS1_EE
000000000021ca60 V _ZTISt6vectorIN7luabind5valueESaIS1_EE
00000000000185f0 V _ZTSN3oss3lua15LuaSensorScriptE
0000000000018510 V _ZTSN3oss3lua8LuaGroupE
00000000000185d0 V _ZTSN7luabind12value_vectorE
00000000000181e0 V _ZTSNSt3tr111_Sp_deleterIN3oss3lua15LuaSensorScriptEEE
0000000000018260 V _ZTSNSt3tr121_Sp_counted_base_implIPN3oss3lua15LuaSensorScriptENS_11_Sp_deleterIS3_EELN9__gnu_cxx12_Lock_policyE2EEE
0000000000018560 V _ZTSSt12_Vector_baseIN7luabind5valueESaIS1_EE
00000000000185a0 V _ZTSSt6vectorIN7luabind5valueESaIS1_EE
000000000021cb20 V _ZTVN3oss3lua15LuaSensorScriptE
000000000021c920 V _ZTVN3oss3lua8LuaGroupE
000000000021cb00 V _ZTVN7luabind12value_vectorE
000000000021c400 V _ZTVNSt3tr121_Sp_counted_base_implIPN3oss3lua15LuaSensorScriptENS_11_Sp_deleterIS3_EELN9__gnu_cxx12_Lock_policyE2EEE
```

Das ganze betrifft aber nicht nur lua-close. Wenn ich diesen Code aktiviere:


```
luabind::module(this->LuaState) [
                    luabind::def("oss::GetVariable", &oss::tree::TreeNode::GetVariable)
                    ];
```

bekomme ich gleich eine ganze flut von fehlermeldungen:


```
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_error(lua_State*)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_rawlen(lua_State*, int)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_tolstring(lua_State*, int, unsigned long*)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_gettop(lua_State*)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_type(lua_State*, int)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_pushvalue(lua_State*, int)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_pushlstring(lua_State*, char const*, unsigned long)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_close(lua_State*)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_pushstring(lua_State*, char const*)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_concat(lua_State*, int)'
/home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so: Nicht definierter Verweis auf `lua_touserdata(lua_State*, int)'
```

Alle immer ein nicht definierter Verweis.

mfg, pointhi


----------



## deepthroat (4. November 2013)

pointhi hat gesagt.:


> Genau, so ist es. Hier ist die ausgabe:
> 
> 
> ```
> ...


Hier ist das Problem.

Irgendwie wurde die C Funktion "lua_close" als C++ Funktion unter dem Namen "_Z9lua_closeP9lua_State" verarbeitet (name mangling).

Scheinbar hat lua.h keine #ifdef __cplusplus Guards...

Du mußt lua.h so einbinden:

```
extern "C" {
#include <lua5.2/lua.h>
}
```


----------



## pointhi (4. November 2013)

thx, funktioniert endlich . Mich wunderts ein wenig das lua die nötigen #ifdef anweisungen nicht im code hat.

mfg, pointhi


----------

