C Code mit g++ compilieren/linken

Gast #2538041
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.
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.
Gast
> 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 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.
Moderator Persönliche Seite
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.