Sto cercando di ottenere gcc
ld
per ignorare i riferimenti non risolti quando si raggruppa una libreria condivisa da un gruppo di file oggetto compilati con il flag -fpic
.ottenere ld per ignorare i riferimenti non definiti quando si effettua una lib condivisa
Ho provato un sacco di opzioni per quanto, come (sostituito i nomi di file lunghi dei molti file oggetto con alcuni piccoli per brevità):
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
(ho rosso somewhere che -G
sarà consentire riferimenti non risolti, ma non ha avuto fortuna con esso.)
esecuzione, però gcc
(con -Wl,--unresolved-symbols=ignore-all
) si traduce in un minor numero di riferimenti non risolti in quanto collega di default con
-lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt
ma si lamenta ancora di non avere -lopengl32
e -lgdi32
.
Compilare il lib senza -fpic
, stashing tutti i file oggetto in un .a
con ar
e statico di collegamento ad esso, pur avendo il programma di collegamento exe per -lopengl32
e -lgdi32
risultati nel lavoro completamente bene.
I messaggi di errore effettivi (sostituito i nomi lunghi dei file e funzioni per brevità):
[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'
Come posso ottenere ld
per ignorare i riferimenti non definiti (almeno dal libopengl32
e libgdi32
se non libstdc++
ecc troppo) e lasciare che il programma che lo usa possa collegarsi a loro?
Quando ho ricevuto l'errore '__gxx_personality_seh0 'nella mia roba ho compilato con g ++ invece di gcc e se ne è andato. Vedi se va bene per te. –
@JerryJeremiah Questo è solo uno dei molti errori che ci sono, fondamentalmente uno per ogni chiamata a qualsiasi funzione std come 'memcpy', qualsiasi chiamata a opengl, ecc. E il punto è che sto cercando di usare' ld' non 'g ++', il programma si sta compilando bene con i file '.o', voglio solo' ld' per creare una lib condivisa dai file '.o' mentre non si collega ad altre librerie. Funziona bene quando si usa 'ld' per creare una lib statica, ma quando si effettua una condivisione, si lamenta di non collegarsi a stdlib, opengllib, ecc. Il programma che usa i collegamenti statici della lib a std, opengl ecc, dovrebbe in teoria lavoro anche per condividere. –