2013-02-15 17 views
15

Mam problem z budowaniem wspólnej biblioteki z GCC/Linux. Obecnie ta wspólna biblioteka jest tworzona z opcją GCC/libtool "-shared" i wszystko jest w porządku.Łączenie biblioteki statycznej ze współdzieloną podczas kompilacji?

Teraz istnieją dwie dodatkowe statyczne biblioteki (pliki .a), które należy dodać do tego udostępnionego, ponieważ zapewniają one pewną funkcjonalność, która jest wymagana przez współdzieloną. Dodanie tych statycznych bibliotek z opcją "-l" nie pomaga, a potem nie są częścią pliku .so.

Jak zatem zmusić GCC/libtool, aby naprawdę dodać kod tych statycznych bibliotek do biblioteki współdzielonej?

Dzięki!

+0

Do tworzenia plików wykonywalnych można po prostu dodać pełną ścieżkę biblioteki statycznej do opcji budowlanych gcc, takie jak: 'gcc -Wall -g live_mystuff.c -o my_app /usr/local/src/ffmpeg/libswscale/libswscale.a -lpthread -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad ...' It może działać również do tworzenia bibliotek współdzielonych. Spróbuj. – fritzone

+0

Skąd wiadomo, że "nie są częścią pliku .so"? –

+0

@fritzone: dla plików wykonywalnych, które działają bez problemów, muszę to zrobić dla biblioteki współdzielonej – Elmi

Odpowiedz

21

W tym przypadku potrzebna jest opcja linkera --whole-archive, aby polecić linkerowi włączenie zawartości całej statycznej biblioteki do współużytkowanej biblioteki.

g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive 

Od man ld:

każdego archiwum wymienionego w wierszu poleceń po opcji --whole-archiwum, to każdy plik wynikowy w archiwum w linku zamiast przeszukiwania archiwum dla wymaganych plików obiektów. Zwykle jest to używane do przekształcania pliku archiwum w bibliotekę współdzieloną, zmuszając każdy obiekt do dołączenia do wynikowej biblioteki współdzielonej. Ta opcja może być używana więcej niż jeden raz.

Dwie uwagi podczas korzystania z tej opcji z gcc: Po pierwsze, gcc nie wie o tej opcji, więc musisz użyć -Wl, -whole-archive. Po drugie, nie zapomnij użyć -Wl, -nie-cały-archiwum po liście archiwów, ponieważ gcc doda własną listę archiwów do twojego linku i możesz nie chcieć, aby ta flaga również wpłynęła na te archiwa.

+0

w SunOS. Musiałem używać kresek po "-WL". – stefanct

2

Trzeba tylko --whole-archiwum parametr do życie linker obejmuje bibliotekę, ale powinien on być w stanie wywnioskować własne potrzeby z symbolami niedopasowanych.

Upewnić się, że wszelkie statycznych bibliotek na linii poleceń przyjść po ich utrzymaniu obiektowe plików np:

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC myobjectfile.o mystaticlibrary.a -shared -o mylib.so