创建动态库时如何解析符号?

时间:2019-06-12 01:49:34

标签: c linker

例如,假设我具有以下结构:

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中使用符号-例如,在这种情况下, my_dll中的foo()调用my_dll :: foo或my_program :: foo?

1 个答案:

答案 0 :(得分:1)

是的,链接器运行以完成DLL的构建,并且需要foo的定义才能构建。但是,只要不将包含my_program::foo的同一代码库链接到my_dll.dll,为链接DLL本身而选择的foo将是my_dll::foo

在这里唯一会麻烦的是,如果您有一个shared.lib静态代码库,该库实现了一个独立的foo函数,并且与EXE和DLL都链接在一起。如果DLL具有foo的本地实现,则选择哪个DLL可能是模棱两可的。