2010-04-15 2 views
26

Под gcc (g ++) я собрал статическую библиотеку .a (назовите ее some_static_lib.a). Я хочу связать (это правильная фраза?) Этот файл .a в другую динамическую библиотеку (назовите ее libsomeDyn.so), которую я создаю. Хотя .so компилирует, я не вижу содержание .a под .so используя nm команду:Как связать статическую библиотеку с динамической библиотекой в ​​gcc

/USR/BIN/г ++ -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

Я не вижу функции под some_static_lib.a под libsomeDyn.so. Что я делаю не так?

ответ

33

Статические библиотеки имеют специальные правила, когда дело доходит до ссылки. Объект из статической библиотеки будет добавлен только в двоичный файл, если объект предоставляет неразрешенный символ.

В Linux, вы можете изменить это поведение с помощью опции --whole-archive линкера:

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

Итак, у меня есть какая-то странная зависимость в статической библиотеке. Он ссылается на функцию, включенную в динамическую библиотеку. Как указать gcc найти неопределенную ссылку внутри динамической библиотеки? Спасибо – bob

+0

@bob - не должно быть проблем со статической библиотекой, ссылающейся на символ в динамической библиотеке (после связывания статической библиотеки это так же, как если бы вы напрямую ссылались на .o в командной строке). Я подозреваю, что должна быть какая-то другая проблема и рекомендуем опубликовать новый вопрос. –

+0

Это решение для меня, но на OSX мне пришлось использовать '-all_load' как эквивалент' -whole-archive', как мне предложили IRC. Надеюсь, это поможет кому-то другому! – vmonteco

14

Для каждого, который приходит через эту проблему, как я (и не понять ответ правильно): вот короткий МЕТОДИЧЕСКИЕ генерировать динамическую библиотеку (libmylib.so) из статической (mylib.a):

1.) создать файл mylib.c, что только импортирует файл mylib.h

2.) компилировать этот MyLib .c на mylib.o с

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

3.) генерируют динамическую библиотеку с помощью следующей команды:

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

Это работало, по крайней мере для меня, превращая статическую библиотеку (скомпилированный с -fPIC) для динамической библиотеки. Я не уверен, что это будет работать для других библиотек.

+2

- это шаг 2, который должен сказать «mylib.o» вместо «msat.o»? – mwag

+0

Я не тестировал его, но основная идея, скорее всего, ОК. Технически - любой архив - это вариант компоновщика (gcc не поймет его, если вы передадите его как «gcc -whole-archive»). Вместо этого он должен быть перенесен за «-Wl», например: gcc -shared -Wl, - whole-archive, -soname, libmylib.so ... Я бы отредактировал ответ, но у меня нет возможности проверить, работает. В текущей форме это приведет к ошибке gcc («непризнанная опция командной строки» - «все-архив»). –

+0

Также -Wl, - весь архив ...-Wl, - блок без архива должен быть вокруг статической библиотеки (mylib.a). Как в принятом ответе. –

Смежные вопросы