2013-07-03 9 views
5

Sto cercando di ottenere gccld 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?

+0

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

+0

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

risposta

0

Come posso ottenere ld per ignorare i riferimenti indefiniti

GNU ld (e la maggior parte degli altri linker UNIX) già ignora i riferimenti non definiti per la costruzione di una libreria condivisa.

Sembra che si possa essere su AIX, dove le librerie e gli eseguibili condivisi sono molto simili e si applicano regole speciali. g++ -shared ... dovrebbe comunque funzionare anche su AIX.

+0

Non sono sicuro di cosa intendi per AIX, avrei dovuto dirlo, ma sono su Win8 con l'ultima versione di mingw ('gcc (rev0, Costruito da MinGW-builds project) 4.8.1') e ('GNU ld (GNU Binutils) 2.23.2') e no,' g ++ -shared ... -o libout.so' non produce riferimenti indefiniti da stdlib ma continua ad avere opengl32 e gdi linked. ('riferimento non definito a '__imp_glCullFace'',' riferimento non definito a' __imp_glClearDepth'' etc), grazie per il suggerimento, comunque, qualsiasi altra idea per cui 'ld' sembra ignorare' --unresolved-symbols = ignore-all'? –

Problemi correlati