C++ Visual Studio 库

标签 c++ visual-studio static-libraries

有什么方法可以使 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/

相关文章:

c++ - 这是在 C++ 中将一个类对象包含在另一个类中的最佳方式

c++ - 我怎样才能将文件拖放到哪个 gtkmm 图像小部件

visual-studio - 如果我切换回 Visual Studio Express,我会感到痛苦吗?

c - 获取库中使用的库列表

c++ - 对于各种编程语言和环境,静态变量通常意味着什么?

c++ - ostream << 在类中重载 crush

c# - 基于常量的 Visual Studio 条件项目引用

c# - DragDrop 注册在安装项目中未成功

DLL 和 LIB 文件 - 是什么以及为什么?

macos - 跨版本编译程序中的静态库