Может ли динамическая библиотека зависеть от статической библиотеки в C и наоборот? - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь понять статические библиотеки и общие объекты в C. Я пытаюсь понять, может ли один тип библиотеки зависеть от другого типа.

Рассмотрим сценарий:

libA.также есть функция foo_A_dyn ():

libA.so ---> foo_A_dyn ()

foo_A_dyn () использует функцию foo_B_static (), которая определена в libB.a и является статическойбиблиотека.

libB.a ---> foo_B_static ()

Мои библиотеки построены следующим образом:

gcc -c foo_B.c -o foo_B.o
ar -cvq libB.a foo_B.o

gcc -fPIC -c foo_A.c -o foo_A.o
gcc -shared libA.so foo_A.o -I.

gcc main.c -lA -lB -L. -I. -o EXE

Примечание: main.c выполняет вызовв foo_A_dyn () и НЕ вызывает foo_B_static () напрямую.

И теперь, когда я пытаюсь создать свой исполняемый EXE-файл, я получаю сообщение об ошибке «неопределенная ссылка на foo_B_static».

Iдумаю, что ошибка кажется подлинной, но я не могу расшифровать обоснование этого и изложить ее словами.

Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вот что делает компоновщик.Когда мы связываем наш исполняемый файл («EXE» выше), у него есть некоторые символы (функции и другие вещи), которые не разрешены.Он просмотрит список библиотек, которые следуют в последовательном порядке, пытаясь разрешить неразрешенные символы.Попутно он обнаруживает, что некоторые символы предоставляются libB.so, поэтому он отмечает, что теперь они разрешаются этой библиотекой.Проходя через libB.so, он находит некоторые символы, которые не были разрешены, и пытается разрешить их, просматривая следующую библиотеку.

Когда мы упорядочиваем библиотеки следующим образом:

gcc main.c -lA -lB -L. -I. -o EXE

Линкер не может найти определение символов, используемых в libB, в libA.Причина может заключаться в том, что обратная ссылка недоступна.

Я также выяснил, что:

  1. общий объект может зависеть от статического архива,

  2. статический архив может зависеть от общего объекта, а

  3. один статический архив может зависеть от другого статического архива

Пожалуйста, дайте мне знать, если я где-то ошибся.

0 голосов
/ 03 декабря 2018

Из опции ссылки gcc :

-библиотека
-l библиотека
...
Имеет значение, где в команде вы пишетеэтот вариант;компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке.Таким образом, 'foo.o -lz bar.o' ищет библиотеку 'z' после файла foo.o, но перед bar.o.Если bar.o ссылается на функции в 'z', эти функции могут не загружаться.

Попробуйте:

gcc main.c -lB -lA -L. -I. -o EXE
...