Odpowiedzi:
Odnosić się do:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Aby ją połączyć, potrzebujesz statycznej wersji biblioteki.
Biblioteka współdzielona jest w rzeczywistości plikiem wykonywalnym w specjalnym formacie z określonymi punktami wejścia (i zawiera kilka lepkich problemów z adresowaniem). Nie zawiera wszystkich informacji potrzebnych do statycznego łączenia.
Nie można łączyć statycznie udostępnionej biblioteki (ani dynamicznie łączyć biblioteki statycznej).
Flaga -static
zmusi konsolidator do użycia bibliotek statycznych (.a) zamiast udostępnionych (.so). Jednak biblioteki statyczne nie zawsze są instalowane domyślnie, więc może być konieczne samodzielne zainstalowanie biblioteki statycznej.
Innym możliwym podejściem jest użycie statifier lub Ermine . Oba narzędzia przyjmują jako dane wejściowe dynamicznie połączony plik wykonywalny, a jako dane wyjściowe tworzą samodzielny plik wykonywalny z osadzonymi wszystkimi bibliotekami współdzielonymi.
Jeśli chcesz połączyć, powiedzmy, libapplejuice statycznie, ale nie, powiedzmy, liborangejuice , możesz połączyć w ten sposób:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Jest zastrzeżenie - jeśli liborangejuice
używa libapplejuice
, libapplejuice
zostanie również dynamicznie połączony.
Będziesz musiał łączyć się liborangejuice
statycznie wraz z, libapplejuice
aby uzyskać libapplejuice
statyczny.
I nie zapomnij zachować -Wl,-Bdynamic
, w przeciwnym razie skończysz łącząc wszystko statyczne, w tym libc
(co nie jest dobre do zrobienia).
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB używa libA , jest połączona i ldd
nie pokazuje odniesienia do libA . Plik wykonywalny działa dobrze. Testowany za pomocą g ++ 4.7.3.
Jeśli masz plik .a swojej biblioteki współdzielonej (.so), możesz po prostu dołączyć go z pełną ścieżką, tak jakby był plikiem obiektowym, na przykład:
To generuje main.o po prostu kompilując:
gcc -c main.c
To łączy ten plik obiektu z odpowiednią biblioteką statyczną i tworzy plik wykonywalny (o nazwie „main”):
gcc main.o mylibrary.a -o main
Lub jednym poleceniem:
gcc main.c mylibrary.a -o main
Może to być również ścieżka bezwzględna lub względna:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Tak, wiem, że to pytanie od 8 lat, ale powiedziano mi, że można statycznie łączyć się z biblioteką obiektów współdzielonych i to był dosłownie największy hit, gdy szukałem więcej informacji na jego temat.
Aby wykazać, że rzeczywiście statycznie łączenie biblioteki dzielonego obiektu nie jest możliwe ld
( gcc
„s łącznik) - w przeciwieństwie do tylko kilka osób, twierdząc, że nie jest to możliwe - użyć następującego gcc
polecenia:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Oczywiście będziesz musiał skompilować objectname.o
z sourcename.c
, i prawdopodobnie powinieneś również stworzyć własną bibliotekę obiektów współdzielonych. Jeśli to zrobisz, użyj -Wl,--library-path,.
, aby ld mógł znaleźć twoją bibliotekę w lokalnym katalogu.)
Rzeczywisty otrzymany błąd to:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Mam nadzieję, że to pomoże.
Trochę późno, ale ... znalazłem link, który zapisałem kilka lat temu i pomyślałem, że może się wam przydać:
CDE: Automatyczne tworzenie przenośnych aplikacji dla systemu Linux
http://www.pgbovine.net/cde.html
Wykonaj plik binarny, przekazując jako argument nazwę pliku binarnego, który chcesz uczynić przenośnym, na przykład: nmap
./cde_2011-08-15_64bit nmap
Program odczyta wszystkie biblioteki dowiązane do nmap i jego elementów zależnych i zapisze je wszystkie w folderze o nazwie cde-package / (w tym samym katalogu, w którym jesteś).
Pamiętaj, że aby uruchomić przenośny program, musisz uruchomić plik binarny znajdujący się w cde-package / nmap.cde
Z poważaniem
W gcc nie jest to obsługiwane. W rzeczywistości nie jest to obsługiwane w żadnym istniejącym kompilatorze / konsolidatorze, o którym wiem.