Неправильное представление о статических / неявных ссылках против динамических / явных ссылок - PullRequest
1 голос
/ 24 февраля 2020

Я недавно узнал, что статические и неявные линки в основном одно и то же , просто разные номенклатуры. Насколько я понимаю, когда вы статически (неявно) ссылаетесь на двоичный файл, вы по определению ссылаетесь на файл *.lib (windows) или *.a (linux), часто используя target_link_libraries в cmake. С другой стороны, когда вы явно связываете (используя LoadLibrary на windows), вы по определению ссылаетесь на файл *.dll (или *.so на linux) (и нет соответствующей команды cmake, потому что все работа выполняется внутри самого кода).

Однако в нескольких местах я читал людей, ссылающихся на статически / косвенно ссылки на файл dll, что меня смутило. Очевидно, что где-то есть дыра в моих знаниях, и я надеялся, что кто-нибудь здесь сможет ее закрыть.

Редактировать

Было отмечено, что этот вопрос относится главным образом к windows, что он и делает. Однако в настоящее время я пытаюсь создать кроссплатформенный код, поэтому мне все еще интересно, как (или если) эти концепции обобщаются на другие платформы.

1 Ответ

2 голосов
/ 25 февраля 2020

На самом деле существует 3 различных типа ссылок, а не 2.

Для UNIX:

  1. Ссылка на архив (aka stati c):

    gcc main.o libfoo.a

  2. ссылка на динамику c (она же общая) библиотека:

    gcc main.o libfoo.so

  3. Ссылка на libdl, которая позволяет dlopen произвольно использовать другие совместно используемые библиотеки (которые не должны существовать на момент ссылки):

    gcc main.o -ldl

И 2, и 3 включают динамический компоновщик c (и используют общие библиотеки), но в разной степени.

Эквивалент существует в Windows: когда вы ссылаетесь на foo.lib, вы используете либо 1 или 2, в зависимости от того, содержит ли foo.lib фактический код или относится к foo.dll.

Когда вы используете LoadLibrary, вы в случае 3.

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