如果可执行文件和共享库包含同名函数会怎样?例如 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/