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



对于LinuxWindows,我使用相同的waf脚本为程序编译shared-library(该程序能够在运行时加载共享库(。

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

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

在这种情况下,WindowsLinux之间有什么区别?为什么我必须在Windows下的链接时间解析符号?有旗帜或类似的东西可以避免这种情况吗?

Linux允许在共享库中使用未解析的符号,但Windows不允许。我不太清楚造成这种差异的原因。在里面https://lists.gnu.org/archive/html/libtool/2007-04/msg00070.html例如,你可以看到一种观点,即在Linux上;以允许共享库中的循环引用";。

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

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

最新更新