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
-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?
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. –
@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. –