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