О компиляции с .so в Linux

Я разработал общую библиотеку B.so, которая зависит от A.so. Когда я пишу программу test.exe с использованием B.so, но возникает ошибка компиляции, она говорит, что некоторые символы (символы есть в A.so) не найдены. Моя линия сборки:

gcc test.c -o test.exe -fPIC -I./ -L./ -lB

Есть ли у нас метод, как успешно собрать test.exe, но не связать A.so.


person iceKing    schedule 24.04.2014    source источник
comment
Пробовали ли вы также связываться с A?   -  person Some programmer dude    schedule 24.04.2014
comment
да, если я добавлю A.so, все будет в порядке. Я хочу собрать SDK b.so, однако я не хочу, чтобы сборка test.exe нуждалась в A.so   -  person iceKing    schedule 24.04.2014
comment
Итак, вы хотите, чтобы символы (переменные/функции/и т. д.), находящиеся в вашей библиотеке А, просто волшебным образом появлялись во всем, что связано с библиотекой Б? Это маловероятно для большинства компиляторов. Вы могли бы потенциально включить A в B полностью, чтобы обойти это, хотя...   -  person twalberg    schedule 24.04.2014
comment
@twalberg Некоторое время назад у GNU ld было другое поведение в такой ситуации, оно автоматически ссылалось на A.so. Но больше не делает.   -  person Lee Duhem    schedule 24.04.2014


Ответы (1)


как успешно собрать test.exe, но не связать A.so.

Есть как минимум два метода:

  1. экспортировать правильный LD_LIBRARY_PATH

    export LD_LIBRARY_PATH=/path/to/A
    gcc ... -lB
    
  2. используя ld вариант -rpath (обнаружен самим спрашивающим @iceKing)

    gcc -Wl,-rpath=/path/to/A ...
    

В обоих случаях ld будет автоматически искать библиотеки, явно зависящие от списка этих библиотек.

person Lee Duhem    schedule 24.04.2014
comment
Спасибо за ваш ответ. Однако при сборке B.so я использую ссылку -lrt -lcurl, а при сборке test.exe они не нужны? Зачем? - person iceKing; 24.04.2014
comment
@iceKing Вы действительно использовали функцию из libcurl.so в своем B.so? - person Lee Duhem; 24.04.2014
comment
Да, возможно, он выбирает статическую библиотеку. - person iceKing; 25.04.2014
comment
У меня есть другой метод, но я не знаю, почему. Я копирую папку A.so для сборки и добавляю флаги -Wl,-rpath=. тогда он будет успешно скомпилирован. - person iceKing; 25.04.2014
comment
@iceKing Если вы хотите знать, ознакомьтесь с объяснением параметра -rpath на справочной странице ld. - person Lee Duhem; 25.04.2014
comment
@iceKing Нет, совсем нет, это очень хороший вопрос. - person Lee Duhem; 25.04.2014