Как разрешаются символы при создании динамической библиотеки? - PullRequest
0 голосов
/ 12 июня 2019

Например, допустим, у меня есть следующая структура:

my_program | main.c - defines main() | foo.c - defined foo() my_dll | dll_start.c - defined dll_start() | foo.c - defines foo()

, где main () вызывает foo (), а затем dll_start ().

В каком порядке они называются?Например, это:

  1. my_program :: main
  2. my_program :: foo
  3. my_dll :: dll_start
  4. my_dll :: foo

?

По сути, я хочу знать, всегда ли при создании динамической библиотеки компоновщик (работает ли компоновщик?) Всегда использует символы внутри dll при разрешении символов внутрисам dll - например, в этом случае foo () внутри my_dll вызывает my_dll :: foo или my_program :: foo?

1 Ответ

1 голос
/ 12 июня 2019

Да, компоновщик запускается, чтобы завершить сборку DLL, и для сборки потребуется определение foo. Но если вы не связываете одну и ту же библиотеку кода, содержащую my_program::foo, с my_dll.dll, то foo, выбранный для связывания самой DLL, будет my_dll::foo.

Единственный случай, когда у вас могут возникнуть проблемы, - это если у вас есть библиотека статических кодов shared.lib, которая реализует независимую функцию foo и связана как с EXE, так и с DLL. Может быть неоднозначно, какую библиотеку DLL подхватит, если она имеет локальную реализацию foo.

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