Hallo zusammen, ich habe ein etwas seltsames problem. Es geht um die Scriptsprache lua und deren interpreter. Es handelt sich um ein system das einen lua interpreter beinhaltet. Wenn ich jetzt eine library für diesen interpreter schreiben möchte und dies mit gcc compiliere funktioniert alles wunderbar. Auch wenn die datei .cpp heißt (mit extern "C") funktioniert alles wunderbar. Wenn ich den selben code mit g++ compiliere ist der code erstmal 10 KB kleiner (bei einer größe von normalerweise 18KB) und der lua Interpreter kann die Bibliothek nichtmehr laden. http://cs.brynmawr.edu/Courses/cs380/fall2011/luar-topics2.pdf meine compiler optionen: g++ -fPIC -c file.cpp -o file.o -llua meine linker optionen: g++ -shared -Wl,-soname,libfile.so -o libfile.so file.o Hat jemand eine Idee, ob es da evtl. eine compiler option gibt die das verhindert? Hintergrund warum ich das brauche ist, dass ich c++ code mit verwenden möchte und ich daher den g++ brauche. Danke im Voraus Gruß
Ich hab zwar keine Lösung für den Problem, aber > Wenn ich den selben code mit g++ compiliere ist der code erstmal > 10 KB kleiner da ist was faul. C++ Compiler können zwar viel optimieren, aber über 50% Codeeinsparung bei einem original C-Code holen sie nicht raus. Das ist mindestens einen Faktor 10 zu viel. 5% würde ich mit Ach und Krach vielleicht noch glauben.
Karl Heinz Buchegger schrieb: > C++ Compiler können zwar viel optimieren Selbst diese müsste man aber erst einschalten. Er hat keine -O-Option mitgegeben, was einem -O0 entspricht. Compilierer schrieb: > und der lua Interpreter kann die Bibliothek > nichtmehr laden. *Nasenzieher aus der Kiste hol'* Welche Fehlermeldungen gibt es denn?
Compilierer schrieb: > Auch wenn die datei .cpp heißt (mit extern "C") > funktioniert alles wunderbar. Wenn ich den selben code mit g++ > compiliere ist der code erstmal 10 KB kleiner (bei einer größe von > normalerweise 18KB) und der lua Interpreter kann die Bibliothek > nichtmehr laden. d.H. du kompilierst mit g++ und extern "C", und es geht, und dann kompilierst du mit g++ ohne extern "C" und es geht nicht? vergleich mal die Ausgaben von "nm"/"readelf --dyn-syms" für beide versionen.
> Welche Fehlermeldungen gibt es denn? Er sagt mir File not found. (Die Datei ist aber mit 100% sicherheit vorhanden, ich seh sie ja) Die Fehlermeldung: Lua Run Runtime ERROR in /usr/xxxx/test.lua:1: error loading module 'libluatest' from file '/lib/libluatest.so': File not found Lua stack traceback: [C]: ? [C]: ? [C]: in function 'require' [string "/usr/xxxx/test.lua:1"]:2: in main chunk > d.H. du kompilierst mit g++ und extern "C", und es geht, und dann > kompilierst du mit g++ ohne extern "C" und es geht nicht? Nein. Ich kompiliere folgendes: dateiendung .c ohne extern "C" mit gcc => funktioniert dateiendung .cpp ohne extern "C" mit gcc => funktioniert nicht dateiendung .cpp mit extern "C" mit gcc => funktioniert dateiendung .cpp ohne extern "C" mit g++ => funktioniert nicht dateiendung .cpp mit extern "C" mit g++ => funktioniert nicht
Compilierer schrieb: > dateiendung .cpp ohne extern "C" mit gcc => funktioniert nicht Und die Fehlermeldung dabei heißt "funktioniert nicht"?
Compilierer schrieb: > dateiendung .cpp ohne extern "C" mit g++ => funktioniert nicht > dateiendung .cpp mit extern "C" mit g++ => funktioniert nicht Ok, also kein Name-Mangling Problem. Dann könnten evtl. die C++-Libraries das Problem sein. vergleich mal den "ldd"-Output für die g++ und gcc-Varianten. Irgendwie hab ich im Hinterkopf, dass die libdl beim Nachladen von Modulen nicht automatisch deren Dependencies mit reinzieht.
> Und die Fehlermeldung dabei heißt "funktioniert nicht"?
Die Fehlermeldung steht doch da oben.
Irgendwie geht mir das alles zu durcheinander. Deine Compiler-Kommandozeile enthält ein -c (also "compiliere in eine Objektdatei") und zugleich ein -llua, das dort nicht benutzt wird, weil ja gar nicht gelinkt wird. Deine Link-Kommandozeile enthält kein -llua mehr. In deiner Fehlermeldung taucht plötzlich ein /lib/libluatest.so auf, weiter oben war noch die Rede von libfile.so. In libluatest.so wird offenbar ein Modul namens "luatest" gesucht und nicht gefunden. Dem könntest du dich mit dem Tool objdump nähern, um dir die Namen der Symbole darin anzeigen zu lassen. Du kannst auch mal strace nehmen um zu sehen, woher das "No such file or directory" kommt; gut möglich, dass das eine fehlerhafte Fehlermeldung ist, weil einfach jemand strerror[errno] ausgegeben hat, aber an der Stelle, an der der Fehler auftrat, errno gar nicht aktuell gesetzt worden ist (sodass es noch von einer früheren Operation gesetzt war). Ich glaube, du solltest mal ein minimales Beispiel zusammenstellen, mit dem das jemand anders auf seinem System nachvollziehen kann.
Warum gibst du denn -llua beim Compilieren an, wo es witzlos ist, anstatt beim Linken?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.