【问题标题】:Can't compile shared library under Windows due to undefined reference由于未定义引用,无法在 Windows 下编译共享库
【发布时间】:2020-02-20 17:10:06
【问题描述】:

我对@9​​87654324@ 和Windows 都使用相同的waf 脚本来为程序(能够在运行时加载共享库)编译shared-library

为了创建这个库,我导入了一些主程序的头文件,这样我就可以在库中调用主程序的函数,并且在运行时解析符号,这在 Linux 下有效。

在 Windows 下,我无法构建库,因为它对我在库中调用的主程序的每个函数都显示 undefined reference

在这种情况下WindowsLinux 有什么区别?为什么我必须在Windows 下的链接时解析符号?有没有标志或类似的东西可以避免这种情况?

【问题讨论】:

  • 一个更好的问题是为什么你不必在 Linux 上这样做......链接器应该让你使用未定义的符号而不关心是没有意义的。
  • 您要创建静态库还是动态库?我不明白你的模块结构,你想根据你程序的功能创建一个库吗?我想您的程序是一个“.exe”,您打算如何将它们与程序的功能(.exe)联系起来?通常,它是加载库的“.exe”,而后者又可以加载其他库……而据我了解,在这里,您想构建一个具有“.EXE”功能的库
  • 我问了另一个问题,我在其中简化了问题并展示了一个最小的可重现示例 (stackoverflow.com/questions/60380196/…)

标签: c gcc shared-libraries undefined-reference


【解决方案1】:

Linux 允许在共享库中使用未解析的符号,但 Windows 不允许。 我不太了解这种差异的原因。例如,在https://lists.gnu.org/archive/html/libtool/2007-04/msg00070.html 中,您可以看到一种观点,即在 Linux 上它是“允许共享库中的循环引用”。

在 Windows 上,您可以使用/FORCE:UNRESOLVED 链接器参数(请参阅https://docs.microsoft.com/en-us/cpp/build/reference/force-force-file-output?view=msvc-170)获得与 Linux 上相同的行为,但它有一个限制,即您的 DLL 必须有一个入口点。

在 Linux 上,您可以通过 -Wl,-no-undefined 链接器参数获得与在 Windows 上相同的行为。此外,您可以使用参数-Wl,--no-allow-shlib-undefined 仅在您链接的共享库中禁止未定义符号(请参阅https://linux.die.net/man/1/ld)。

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 2021-05-17
    • 2015-02-15
    • 2013-04-15
    • 2019-08-05
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多