2010-04-15 15 views
26

W gcc (g ++) skompilowałem bibliotekę statyczną .a (nazywam ją some_static_lib.a). Chcę połączyć (jest to właściwe zdanie?) Ten plik .a do innej biblioteki dynamicznej (nazywam ją libsomeDyn.so), którą buduję. Choć .so kompiluje, nie widzę zawartości .a pod .so użyciu nm polecenie:jak powiązać bibliotekę statyczną z biblioteką dynamiczną w gcc

/usr/bin/g ++ -fPIC -g -O2 -Wall -Werror -pipe -march = Pentium3 -mtune = prescott -MD -D_FILE_OFFSET_BITS = 64 -DLINUX -D_GNU_SOURCE -D_THREAD_SAFE -I ../../../../../../../../ -I ../../ .. /../../../../..//libraries -Wl, -rpath,/usr/lib -o libsomeDyn.so some.o another.o some_static_lib.a -shared -Wl -x - Wl -soname, libsomeDyn.so

Nie widzę funkcji pod some_static_lib.a pod libsomeDyn.so. Co ja robię źle?

Odpowiedz

33

Biblioteki statyczne mają specjalne zasady dotyczące łączenia. Obiekt z biblioteki statycznej zostanie dodany do pliku binarnego, jeśli obiekt dostarcza nierozwiązany symbol.

W systemie Linux, można zmienić to zachowanie z opcją --whole-archive łącznikowej:

g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive 
+0

Mam więc dziwną zależność w bibliotece statycznej. Odwołuje się do funkcji zawartej w bibliotece dynamicznej. Jak powiedzieć gcc, aby znaleźć niezdefiniowane odwołanie w bibliotece dynamicznej? Dzięki – bob

+0

@bob - nie powinno być żadnego problemu z biblioteki statycznych odwołującego symbol wewnątrz biblioteki dynamicznej (po połączeniu statycznego biblioteki, to tak samo jakbyś bezpośrednio odwoływać się .o w linii poleceń). Podejrzewam, że musi być jakiś inny problem i zalecam opublikowanie nowego pytania. –

+0

To było rozwiązanie dla mnie, ale na OSX musiałem użyć '-all_load' jako odpowiednika' --whole-archive', jak ktoś zaproponował mi na IRC. Mam nadzieję, że to pomoże komuś innemu! – vmonteco

14

Dla każdego, kto jest po drugiej stronie tego problemu jak ja (i nie zrozumieć odpowiedź prawidłowo): Oto krótka howto generować dynamiczne biblioteki (libmylib.so) z jednego statycznego (mylib.a):

1.) Utwórz plik mylib.c że tylko importuje plik mylib.h

2.) sporządza ten myLib .c do mylib.o z

gcc -c -fPIC mylib.c -o msat.o 

3.) generuje dynamiczne biblioteki z następującego polecenia:

gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a 

Że pracował przynajmniej dla mnie, przekształcając statyczne biblioteki (skompilowany z flagą -fPIC) do dynamiczny biblioteki. Nie jestem pewien, czy to będzie działać dla innych bibliotek.

+2

jest krok 2 ma mówić "mylib.o" zamiast "msat.o"? – mwag

+0

Nie testowałem tego, ale podstawowy pomysł jest prawdopodobnie w porządku. Technicznie rzecz biorąc, --white-archive to opcja linkera (gcc nie zrozumie tego, jeśli przekażesz go jako "gcc --whole-archive"). Zamiast tego powinno zostać przeniesione poza "-Wl", na przykład: gcc -shared -Wl, - whole-archive, -nazwa, libmylib.so ... Chciałbym edytować odpowiedź, ale nie mam sposobu na sprawdzenie, czy to Prace. W obecnym formularzu doprowadzi to do błędu gcc ("nierozpoznana opcja wiersza poleceń" - całe-archiwum ""). –

+0

Również -Wl, - całe archiwum ...-Wl, - blok nie-cały-archiwum powinien znajdować się w bibliotece statycznej (mylib.a). Jak w zaakceptowanej odpowiedzi. –

Powiązane problemy