可以执行和共享库包含同名函数

Can executable and shared library contain functions with the same name?

本文关键字:包含同 函数 共享 执行      更新时间:2023-10-16

如果可执行库和共享库包含同名函数将会发生什么?例如EXE有这样的定义:

extern int fund()
{
   return 0;
}

和共享库有相同的定义:

extern int fund()
{
   return 1;
}

从可执行文件和共享库中调用的函数:1 - Windows版?2 -对于unix系统?

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

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

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

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

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

我看不出unixoid os和Windows在这方面有什么根本的区别。