2013-07-03 10 views
5

Próbuję uzyskać gcc 's ld, aby zignorować nierozwiązane odniesienia podczas łączenia biblioteki współdzielonej z kilku plików obiektów skompilowanych z flagą -fpic.Uzyskanie ld, aby zignorować niezdefiniowane odniesienia podczas tworzenia udostępnionego lib

Próbowałem kilka opcji, takich jak do tej pory (zastąpiony długie nazwy plików z wielu plików obiektowych z kilku małych dla zwięzłość):

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 

(mam czerwony somewhere że -G będzie pozwalają referencje nierozwiązanych, ale nie miał szczęścia z nim.)

Running to chociaż gcc (z -Wl,--unresolved-symbols=ignore-all) skutkuje mniejszą liczbą odniesień nierozwiązanych gdyż łączy domyślnie z

-lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt 

ale nadal narzeka, że ​​nie ma -lopengl32 i -lgdi32.

Kompilacja lib bez -fpic, stashing wszystkie pliki obiektu w .a z ar i statycznego linkowania do niego, mając jednocześnie exe programu odnośnik do -lopengl32 i -lgdi32 wyników w pracy całkowicie w porządku.

Rzeczywiste komunikatów o błędach (zastąpiony długich plików i funkcji nazwy dla zwięzłość):

[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' 

Jak mogę uzyskać ld ignorować referencje niezdefiniowanych (przynajmniej od libopengl32 i libgdi32 jeśli nie libstdc++ itp też) i niech program, który będzie z niego korzystał, łączy się z nimi?

+0

Kiedy dostałem błąd "__gxx_personality_seh0" w moich kompilacjach skompilowałem z g ++ zamiast gcc i odszedł. Sprawdź, czy to działa dla Ciebie. –

+0

@JerryJeremiah To jeden z wielu błędów, w zasadzie jeden dla każdego wywołania dowolnej funkcji standardowej, takiej jak 'memcpy', każde wywołanie opengl, itd. A chodzi o to, że próbuję użyć' ld' not 'g ++', program kompiluje się dobrze do plików '.o', chcę po prostu' ld' zrobić wspólną bibliotekę z plików '.o', nie łącząc się z innymi bibliotekami. Działa to dobrze podczas używania 'ld' do tworzenia statycznej biblioteki lib, ale podczas tworzenia współdzielonej, nie narzeka na stdlib, opengllib itp. Program używający statycznych odnośników do std, opengl itp., Powinien Teoretycznie pracuj też dla wspólnego. –

Odpowiedz

0

Jak mogę uzyskać ld ignorować niezdefiniowane referencje

GNU ld (a większość Inne łączniki UNIX) już ignoruje referencje niezdefiniowane przy budowie biblioteki współdzielonej.

Wygląda na to, że możesz znajdować się w systemie AIX, gdzie udostępnione biblioteki i pliki wykonywalne są bardzo podobne i obowiązują specjalne reguły. g++ -shared ... powinien nadal działać nawet w systemie AIX.

+0

Nie jestem pewien co masz na myśli przez AIX, powinienem był o tym wspomnieć, ale jestem na Win8 z najnowszą wersją mingw ('gcc (rev0, Built by MinGW-builds project) 4.8.1') oraz ('GNU ld (GNU Binutils) 2.23.2') i nie,' g ++ -shared ... -o libout.so' nie zawiera niezdefiniowanych odniesień ze stdlib, ale nadal nalega na posiadanie OpenGL32 i GDI. ('undefined odniesienie do '__imp_glCullFace'',' undefined odniesienie do' __imp_glClearDepth'' etc), dziękuję za sugestię, wszelkie inne pomysły, dlaczego 'ld' wydaje się ignorować' --unresolved-symbols = ignore-all'? –

Powiązane problemy