提问人:user10207893 提问时间:2/21/2020 更新时间:12/27/2021 访问量:532
由于未定义的引用,无法在 Windows 下编译共享库
Can't compile shared library under Windows due to undefined reference
问:
我使用相同的脚本,for 和 for ,为程序编译(能够在运行时加载共享库)。waf
Linux
Windows
shared-library
为了创建这个库,我导入了主程序的一些头文件,这样我就可以在库中调用主程序的函数,符号在运行时被解析,这在 Linux 下是有效的。
在 Windows 下,我无法构建库,因为它说了我在库中调用的主程序的每个函数。undefined reference
和在这种情况下有什么区别?为什么我必须在链接时解析符号?有没有旗帜或类似的东西来避免这种情况?Windows
Linux
Windows
答:
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
评论