Forum: Compiler & IDEs C Code mit g++ compilieren/linken


von Compilierer (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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?

von Εrnst B. (ernst)


Lesenswert?

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.

von Compilierer (Gast)


Lesenswert?

> 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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Compilierer schrieb:
> dateiendung .cpp ohne extern "C" mit gcc => funktioniert nicht

Und die Fehlermeldung dabei heißt "funktioniert nicht"?

von Εrnst B. (ernst)


Lesenswert?

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.

von Compilierer (Gast)


Lesenswert?

> Und die Fehlermeldung dabei heißt "funktioniert nicht"?

Die Fehlermeldung steht doch da oben.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.