由于未定义的引用,无法在 Windows 下编译共享库

Can't compile shared library under Windows due to undefined reference

提问人:user10207893 提问时间:2/21/2020 更新时间:12/27/2021 访问量:532

问:

我使用相同的脚本,for 和 for ,为程序编译(能够在运行时加载共享库)。wafLinuxWindowsshared-library

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

在 Windows 下,我无法构建库,因为它说了我在库中调用的主程序的每个函数。undefined reference

和在这种情况下有什么区别?为什么我必须在链接时解析符号?有没有旗帜或类似的东西来避免这种情况?WindowsLinuxWindows

c gcc 共享库 undefined-reference

评论

0赞 user253751 2/21/2020
一个更好的问题是,为什么你不必在 Linux 上这样做......链接器应该只允许您使用未定义的符号而不关心,这是没有意义的。
0赞 Landstalker 2/21/2020
您想创建静态库还是动态库?我不明白你们模块的结构,你想根据你们程序的功能创建一个库吗?我想您的程序是一个“.exe”,您打算如何将它们与程序的功能链接(.exe)?通常,加载库的是“.exe”,而库又可以加载其他库......而在这里,据我了解,您想使用“.EXE”的功能构建一个库
0赞 the busybee 2/21/2020
请举一个最小的可重现示例
0赞 user10207893 2/25/2020
我问了另一个问题,在这个问题中,我简化了问题并展示了一个最小的可重复示例(stackoverflow.com/questions/60380196/......)

答:

1赞 Alexander Samoylov 12/27/2021 #1

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

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

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