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

标签 c linker

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

我的程序 | main.c - 定义 main() | foo.c - 定义 foo() 我的_dll | dll_start.c - 定义 dll_start() | foo.c - 定义 foo()

其中 main() 调用 foo(),然后调用 dll_start()。

它们按什么顺序命名?例如是不是:

  1. 我的程序::主
  2. my_program::foo
  3. my_dll::dll_start
  4. my_dll::foo

基本上,我想知道当您创建动态库时,链接器(链接器是否运行?)在解析 dll 本身内部的符号时是否总是使用 dll 内部的符号 - 例如,在本例中,是否my_dll 中的 foo() 调用 my_dll::foo 或 my_program::foo?

最佳答案

是的,链接器运行以完成 DLL 的构建,并且需要 foo 的定义来构建。但只要您没有将包含 my_program::foo 的同一代码库链接到 my_dll.dll 中,foo 就会被选中链接 DLL 本身将是 my_dll::foo

唯一会给自己带来麻烦的情况是,如果您有一个 shared.lib 静态代码库,它实现了一个独立的 foo 函数,并且与两个函数链接EXE 和 DLL。如果 DLL 具有 foo 的本地实现,那么 DLL 选择哪一个可能是不明确的。

关于c - 创建动态库时如何解析符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56553654/

相关文章:

PHP 创建 C 字符串

c++ - X11/Xlib c/c++ 字符到 XKeyEvent 键码

c - 在 libusb_fill_interrupt_transfer 回调中使用 "user_data"时出错

opengl -/usr/bin/ld : cannot find -lGL (Nvidia, (L)Ubuntu 12.10)

linux - 为 GTK 功能链接哪些库?

c - 需要关于我的斐波那契程序的解释

c++ - C/C++ ncurses 卡住

c - extern 是可选的吗?

xamarin - 强制(或友好地询问)链接器链接掉特定程序集

c++ - 链接到 gcc 中的 boost 正则表达式