我正在使用相同的waf脚本,用于Linux和Windows,为程序编译shared-library (它能够在运行时加载共享库)。
为了创建这个库,我导入了主程序的一些头部,这样我就可以在库中调用主程序的函数,并且在运行时解析符号,这在Linux下是可行的。
在Windows下,我无法构建库,因为它为我在库中调用的主程序的每个函数都显示了undefined reference。
在这种情况下,Windows和Linux有什么区别?为什么我必须在链接时间解析Windows下的符号?有没有国旗之类的东西来避免这种情况?
发布于 2021-12-27 15:39:21
Linux允许共享库中未解析的符号,但Windows不允许。我不太清楚这种差异的原因。例如,在https://lists.gnu.org/archive/html/libtool/2007-04/msg00070.html中,您可以看到一种观点,即在Linux上,它是“允许共享库中的循环引用”。
在Windows上,您可以获得与Linux上具有/FORCE:UNRESOLVED链接器参数的行为相同的行为(请参阅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)。
https://stackoverflow.com/questions/60325256
复制相似问题