c++ - 可执行文件和共享库可以包含同名函数吗?

标签 c++ c dll shared-libraries exe

如果可执行文件和共享库包含同名函数会怎样?例如 EXE 有这样的定义:

extern int fund()
{
   return 0;
}

和共享库有相同的定义:

extern int fund()
{
   return 1;
}

将从可执行文件和共享库中调用什么函数: 1 - 适用于 Windows? 2 - 对于 unix-base?

PS:当我在我的 MFC 应用程序中定义 AfxWinMain 时,启动时将调用它而不是 MFC DLL 中的 AfxWinMain。我需要一些理论,为什么会这样?

最佳答案

您已经自己回答了标题中的问题。

非共享库依赖在链接时解决,而不是在加载时。一旦链接器满足了对静态库的外部引用,它将保持这种状态,Windows 和 Unix 加载器都不会再尝试解析它(在链接阶段之后,该符号通常甚至在二进制文件中都不“可见”) .

当链接到库时(无论是静态的还是动态的),链接器一旦找到满足要求的引用就停止搜索要解析的符号,并且不会在任何其他(或相同)中进一步查找该符号的库。这就是为什么您可以在 中为同一函数提供多个定义(与目标文件相反,这些文件保证会被彻底搜索,因此会检查是否有重复的符号)。

只有需要在加载时解析的符号才被标记为“外部共享”,并由加载程序在运行时解析。

我认为 unixoid 操作系统和 Windows 在这方面没有根本区别。

关于c++ - 可执行文件和共享库可以包含同名函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39986044/

相关文章:

windows - 在哪里可以找到 Windows(XP、Vista、7 等)上可用的默认 dll 文件列表?

C++ DLL接口(interface)和内存

c++ - 为什么复制构造函数调用其他类的默认构造函数?

c++ - 多线程光线追踪器的噪声

c++ - C 编译的 .so 可以与 C++ 应用程序一起使用吗?

c - 为什么会崩溃? - C

java - 链接Matlab和Java : Library JMatLink. dll无法加载

c++ - Mongodb C++ 驱动程序能够绕过文档结构规则(关于键不以 $ 开头的规则)

C++ MySQL驱动->连接VS2013

c - 对 `printb' 的 undefined reference