Связывание с общими объектами во время компиляции - PullRequest
2 голосов
/ 12 февраля 2011

В Windows многие .dll поставляются со статическим аналогом .lib.Насколько я понимаю, аналог .lib в основном содержит вызовы LoadProcAddress, так что программист не должен делать это сам.По сути, экономия времени.Когда я переключился на Linux, я предполагал, что ситуация была такой же, заменив .dll на .so и .lib на .a, но я пришел к ситуации, которая показывает мне, что это неправильно, и я не могу понять, чтопроисходит:

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

Итак, я действительно не понимаю, что происходит.В Windows я бы никогда не подумал связать файл с DLL.Кроме того, в Windows, если файл .dll сопровождался .lib, и я связывался с .lib во время компиляции, то я ожидал бы иметь зависимость от соответствующего .dll во время выполнения.В этом случае обе эти вещи не соответствуют действительности.

Да, я прочитал основные учебные пособия по общим объектам в Linux, но все, что я прочитал, похоже, указывает на то, что мое первоначальное предположение было верным.Кстати, я должен упомянуть, что я использую Code :: Blocks в качестве IDE, что, как я знаю, усложняет ситуацию, но я на 99% уверен, что когда я говорю это для ссылки на файл .so, это не просто заменафайл .a, потому что получающийся двоичный файл меньше.(Плюс все дело в лдд ...)

В любом случае, спасибо заранее.

Ответы [ 3 ]

1 голос
/ 12 февраля 2018

.lib используются в Windows для динамического связывания. У вас их нет в Linux, вы связываетесь с .so напрямую. Файл .a - это статически построенная библиотека, вы используете ее для статической ссылки.

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

Я ссылался на .a, но когда я выполнил ldd для созданного двоичного файла, он не содержал ссылки на соответствующий файл .so.

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

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

Что вы имеете в виду, что статическое связывание не работает? Нет причины, по которой это не должно ...

0 голосов
/ 12 февраля 2018

Чтобы добавить к уже правильному ответу с помощью tharibo - в некоторых ситуациях (например, отложенная загрузка совместно используемой библиотеки) может быть желательно сделать это способом Windows, то есть связать статическую заглушку вместо .so.Такие заглушки могут быть написаны вручную, сгенерированы сценариями, специфичными для проекта, или с помощью общего инструмента Implib.so .

...