有什么方法可以使 Microsoft Visual Studio 中构建的静态库独立于使用的 CRT(有/没有调试支持)?
我的意思是,对于简单的 C 库,可以使用 gcc
生成代码,然后在 visual studio 中使用相同的静态库。生成的 library.a
文件完全独立于 /MT
或 /MDd
开关,不会导致警告/链接错误。
与 Visual Studio 默认行为相比,您必须构建同一库的两个版本 - 独立用于调试/ Release模式。如果您尝试在调试配置中使用 Release
版本,反之亦然,这会导致丑陋的警告(warning LNK4098: defaultlib "LIBCMT"...
),但有时由于运行时不同而无法编译?
有什么办法可以避免这种情况吗?还是我做错了什么?
最佳答案
要创建一个无论运行时选择如何都将链接的库,有必要使用两个开关:
/MT 针对基本发布运行时构建,/Zl省略默认库名称。
针对 dll 运行时构建将导致编译器使用 __imp_
修饰所有运行时符号(因此,例如,它将尝试链接到 __imp__fread
而不是 _fread
)。因此,您必须选择其中一种静态运行时。
编译器根据所选的库执行隐式默认库编译指示:
#pragma comment(lib,"libcmtd.lib")
是它在代码中的样子。/Zl 使编译器从生成的 .obj(以及 .lib)文件中忽略所有这些指令(隐式和显式)。因此结果应该会干净地链接而不会导致默认库冲突。
关于C++ Visual Studio 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3764716/