Как работают библиотечные зависимости при компоновке? - PullRequest
4 голосов
/ 07 февраля 2011

У меня есть библиотека libmya.so и библиотека libmyb.so.Функции в libmyb.so зависят от функций в libmya.so.Также у меня есть исполняемый файл myexe, который зависит от libmyb.so.Когда я создаю эти библиотеки, в каких правилах я должен указывать опции -l?

Должно ли это быть 1):

libmya.so: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) -o $@ $^

libmyb.so: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) $(LIBS) -o $@ $^ -lmya

myexe: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) $(LIBS) -o $@ $^ -lmyb

или 2)

libmya.so: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) -o $@ $^

libmyb.so: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) $(LIBS) -o $@ $^

myexe: $(OBJ_FILES)
    $(CPP) $(LDFLAGS) $(LIBS) -o $@ $^ -lmya -lmyb

или какой-то другой комбо?

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

Я бы выбрал вариант 1 (хотя вариант 2 работает, я бы не стал его рекомендовать, поскольку всем, кто связывает exe-файл, необходимо запомнить все необходимые транзитивные библиотеки).

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

Следовательно, *Файл 1010 *, который вы создаете, должен быть связан со всеми его зависимостями.

«тупая» библиотека, такая как файл a (статическая библиотека), - это отдельная история;затем вам нужно выполнить все ссылки в исполняемом файле (вариант 2).

Я рекомендую использовать инструмент ldd, чтобы исследовать зависимости как исполняемого файла, так и файла so, чтобы увидеть, как это работает.

Для реального примера того, почему вариант 1 лучше, попробуйте ldd /usr/lib/libpng.so.Обратите внимание, что libpng связан с libz.Если это не так, любой, кто когда-либо ссылается на libpng, также должен будет ссылаться на libz.На самом деле вы можете ссылаться на libpng, даже не зная, что libz задействован.

0 голосов
/ 07 февраля 2011

Библиотеки не зависят друг от друга при их создании. Это исполняемый файл (exe или dll), который зависит от них. Библиотеки - это просто наборы функций и / или данных. Они просто должны быть там, когда их содержимое используется exe / dll во время компоновки (откуда это не важно). Библиотеки не связаны (при их создании), объектные файлы, которые их составляют, архивируются библиотекарем.

Функции в одной библиотеке могут использовать функцию в другой библиотеке, но только во время соединения exe / dll эти зависимости будут разрешены (это означает, что обе библиотеки должны быть связаны в).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...