Связывание с общими объектами во время компиляции

В 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, потому что результирующий двоичный файл меньше. (Плюс весь этот бизнес с ldd...)

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


person Joey    schedule 12.02.2011    source источник


Ответы (3)


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

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

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

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

person rlibby    schedule 13.02.2011
comment
нет, я был удивлен, что вы можете связать динамическую библиотеку. вы не можете связать dll в окнах. - person Joey; 11.03.2018

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

person tharibo    schedule 12.02.2018
comment
Верно, но во многих случаях .lib и .dll в Windows связаны друг с другом. .lib — это небольшая библиотека-заглушка, содержащая функции-оболочки, которые загружают фактические функции из .dll (т. е. LoadProcAddress). Я пытался понять, как это работает в Linux. Я думаю, что ответ заключается в том, что когда вы ссылаетесь на файл .so, вы делаете что-то подобное, но можете ошибаться. - person Joey; 11.03.2018
comment
В яблочко. Другими словами, вы можете считать, что .lib интегрирован в .so для практических целей. - person tharibo; 12.03.2018

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

person yugr    schedule 12.02.2018