Wydaje mi się dziwne, że używa się go -Wl,-Bstatic
w celu określenia, z gcc
którymi bibliotekami chcę łączyć się statycznie. W końcu podam gcc
bezpośrednio wszystkie inne informacje o linkowaniu z bibliotekami ( -Ldir
, -llibname
).
Czy można bezpośrednio powiedzieć sterownikowi gcc, które biblioteki powinny być linkowane statycznie?
Wyjaśnienie: wiem, że jeśli pewna biblioteka istnieje tylko w wersjach statycznych, będzie z niej korzystać bez -Wl,-Bstatic
, ale chcę zasugerować, gcc
że wolę bibliotekę statyczną. Wiem również, że bezpośrednie określenie pliku biblioteki będzie się z nim wiązało, ale wolę zachować semantykę obejmującą biblioteki statyczne i dynamiczne.
źródło
-l:
opcja jest udokumentowana? Której wersji gcc potrzebuję, aby jej użyć?ld
linkera sourceware.org/binutils/docs/ld/Options.html "-l namespec
.. Jeśli nazwa_nazwa ma postać: nazwa_pliku, ld przeszuka ścieżkę do biblioteki w celu znalezienia pliku o nazwie nazwa_pliku, w przeciwnym razie przeszuka bibliotekę ścieżka do pliku o nazwie libnamespec.a. .. w systemach ELF .., ld przeszuka katalog w poszukiwaniu biblioteki o nazwie libnamespec.so przed wyszukaniem biblioteki o nazwie libnamespec.a. .. Zauważ, że to zachowanie nie dotyczy: nazwa_pliku , która zawsze określa plik o nazwie nazwa_pliku. ”. Od binutils 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.htmlMożesz dodać plik .a w poleceniu łączenia:
Ale to nie jest rozmowa ze sterownikiem gcc, ale z
ld
linkerem jako opcjami takimi jak-Wl,anything
są.Kiedy powiesz gcc lub ld
-Ldir -lLIBRARY
, linker sprawdzi zarówno statyczną, jak i dynamiczną wersję biblioteki (możesz zobaczyć proces z-Wl,--verbose
). Aby zmienić kolejność zaznaczonych typów bibliotek, możesz użyć-Wl,-Bstatic
i-Wl,-Bdynamic
. Oto strona podręcznika systemowego gnu LD: http://linux.die.net/man/1/ldAby połączyć swój program z lib1, lib3 dynamicznie i lib2 statycznie, użyj takiego wywołania gcc:
Zakładając, że domyślnym ustawieniem ld jest używanie bibliotek dynamicznych (jest to na Linuksie).
źródło
gcc
.gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
.-l
i-L
są również opcjami konsolidatora.gcc yourfiles /path/to/library/libLIBRARY.a
lub-Wl,-Bstatic
?/path/to/library/libLIBRARY.a
wymaga pełnej ścieżki do napisania, wariant 2-Wl,-Bstatic -llib2 -Wl,-Bdynamic
jest po prostu długi i dodaje 2 dodatkowe opcje i zakłada domyślny tryb Bdynamic, a zaakceptowany wariant 3-l:libXYZ.a
jest krótki i po prostu działa. Wszystkie trzy będą działać w wielu przypadkach, a wariant 2 może nie działać podczas łączenia programów statycznych. Rzeczywisty krok łączenia dla biblioteki jest taki sam we wszystkich wariantach, jak rozumiem.