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

pointhi

Erfahrenes Mitglied
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).

C++:
#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:

Code:
*.../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
 
Zuletzt bearbeitet von einem Moderator:
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?
 
Wird gelinkt:

Code:
-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
 
Schade, dass ich da nicht so im Thema bin. Aber mal eine Frage: Warum verwendest du eigentlich zum Öffnen des Lua-States luabind::eek: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.
 
Zuletzt bearbeitet:
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.
 
Hi.

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

Zeig mal den vollständigen Befehl.
 
Das ist der Befehl der die ganzen Bibliotek linkt:

Code:
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:

Code:
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:
C++:
// 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
 
Zuletzt bearbeitet von einem Moderator:
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:
Code:
nm -D /home/thomas/Dokumente/Projekte/robotic/OpenSensorSystem/dist/Release/GNU-Linux-x86/libOpenSensorSystem.so | grep lua
?
 
Genau, so ist es. Hier ist die ausgabe:

Code:
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:

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

bekomme ich gleich eine ganze flut von fehlermeldungen:

Code:
/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
 
Zuletzt bearbeitet von einem Moderator:
Zurück