2013-07-03 4 views
5

Ich versuche gcc 's ld zu erhalten, um nicht aufgelöste Verweise zu ignorieren, wenn ich eine gemeinsam genutzte Bibliothek aus einer Reihe von Objektdateien zusammensetze, die mit -fpic Flag kompiliert wurden.ld ignoriert nicht definierte Referenzen beim Erstellen einer freigegebenen Lib

ich so weit wie (ersetzt die lange Dateinamen der vielen Objektdateien mit ein paar kleinen Kürze halber) eine Reihe von Optionen ausprobiert:

ld --allow-shlib-undefined --unresolved-symbols=ignore-all -shared 1.o 2.o -o lib0.so 
ld -G 1.o 2.o -o lib0.so 

(Ich habe rot somewhere dass -G wird unaufgelösten Referenzen ermöglichen, hatte aber mit ihm kein Glück.)

Lauf es aber gcc (bei -Wl,--unresolved-symbols=ignore-all) führt zu weniger unaufgelösten Referenzen, wie es mit

standardmäßig verbindet
-lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt 

aber es beschwert sich immer noch über nicht -lopengl32 und -lgdi32.

Kompilieren des lib ohne -fpic, stashing alle Objektdateien in einem .a mit ar und statische Linken, um es während die exe-Programm Link zu -lopengl32 und -lgdi32 Ergebnisse mit in der Arbeit völlig in Ordnung.

Die tatsächlichen Fehlermeldungen (die langen Datei- und Funktionsnamen der Kürze ersetzt):

[file].o: In function `[function]': [file].cpp:19: undefined reference to `memcpy' 
[file].o: In function `[function]': [file].cpp:26: undefined reference to `memcpy' 

[file].o:[file].cpp:(.xdata+0x4c): undefined reference to `__gxx_personality_seh0' 
[file].o:[file].cpp:(.xdata+0x74): undefined reference to `__gxx_personality_seh0' 
[file].o:[file].cpp:(.rdata$[file]]+0x20):undefined reference to `__cxa_pure_virtual' 
[file].o:[file].cpp:(.rdata$[file]]+0x28): undefined reference to `__cxa_pure_virtual' 

Wie kann ich ld bekomme undefinierte Referenzen zu ignorieren (zumindest aus libopengl32 und libgdi32 wenn nicht libstdc++ etc auch) und Lass das Programm, das es benutzen wird, mit ihnen verlinken?

+0

Als ich den '__gxx_personality_seh0'-Fehler in meinen Sachen bekam, kompilierte ich mit g ++ anstelle von gcc und es ging weg. Sehen Sie, ob das für Sie funktioniert. –

+0

@JerryJeremiah Das ist nur einer der vielen Fehler, die es gibt, im Grunde einen für jeden Aufruf einer beliebigen std-Funktion wie "memcpy", irgendeinen Aufruf von opengl usw. Und der Punkt ist, dass ich versuche, 'ld' nicht zu verwenden 'g ++', das Programm kompiliert gerade gut zu '.o' Dateien, ich will nur' ld' eine gemeinsame lib aus den '.o' Dateien machen, während keine Verbindung zu anderen Bibliotheken besteht. Es funktioniert gut, wenn man "ld" verwendet, um eine statische lib zu erstellen, aber wenn man eine gemeinsame macht, klagt es darüber, nicht mit stdlib, openglllib usw. zu verlinken. Das Programm, das die statischen lib-Links zu std, opengl usw. verwendet, sollte es in der Theorie arbeiten für geteilt auch. –

Antwort

0

Wie kann ich ld undefinierte Referenzen zu ignorieren

GNU ld (und den meisten anderen UNIX-Linker) bereits undefinierte Referenzen ignoriert, wenn eine gemeinsame Bibliothek zu bauen.

Es sieht so aus, als wären Sie unter AIX, wo sich gemeinsame Bibliotheken und ausführbare Dateien sehr ähneln und spezielle Regeln gelten. g++ -shared ... sollte auch noch unter AIX funktionieren.

+0

Ich bin nicht sicher, was Sie mit AIX meinen, ich hätte das erwähnen sollen, aber ich bin auf Win8 mit dem neuesten Mingw-Release ('gcc (rev0, gebaut von MinGW-Builds Projekt) 4.8.1') und ('GNU ld (GNU Binutils) 2.23.2') und nein,' g ++ -shared ... -o libout.so' führt zu keinen undefinierten Verweisen von stdlib, aber es besteht immer noch darauf, dass opengl32 und gdi verknüpft sind. ('undefinierter Verweis auf '__imp_glCullFace'',' undefinierter Verweis auf' __imp_glClearDepth' usw.), danke für den Vorschlag, irgendwelche anderen Ideen, warum 'ld' zu ignorieren scheint --unresolved-symbols = ignore-all'? –

Verwandte Themen