MSVC Debug 与 Release 库

这篇具有很好参考价值的文章主要介绍了MSVC Debug 与 Release 库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CMake Debug后缀

set_target_properties(liba PROPERTIES DEBUG_POSTFIX "d")
或者
set(CMAKE_DEBUG_POSTFIX "d")
这样生成的库或者exe程序名会多一个d字符。如下

debug库和release库,c++,开发语言,cmake

链接 vc++ 运行时库

通过/MD、/MT 可以改变MSVC运行库,

  • /MD代表使用动态运行时库,程序运行时需要有MSVCRversionnumber.DLL,这些库是通过安装Download Microsoft Visual C++ Redistributables 获得。例如msvcp140.dll就是在 Microsoft Visual C++ Redistributable for Visual Studio 2015中。
  • /MT会使用静态运行时库,MSVC库会编译链接到exe程序中,所以系统不安装VC++库也可以正常运行,但是这会增加exe的大小,且由于不能共享使用公用的DLL也会消耗更多内存。
  • /MD、/MT都有对应的debug版,/MDd、/MTd,链接时使用的库也是对应的Debug版,例如msvcp140d.dll则是VC++ 2015的Debug版库。这种库需要安装Visual studio 20xx时才能获得,非开发设备一般都没有这种库。

MSVC 链接动态库

 对于动态库都有对应的DLL,DLL本身就是可以执行文件,系统可以直接读取并执行,其内部已经包含了所有运行时的函数或符号。所以动态库生成后其已经可以与编译环境分离,也就是说如果你编译了一个动态库,不管程序时Debug还是Release都可以链接这个库,这个库也不会受编译器版本的限制,大部分情况下不同VS版本都可以通用。

MSVC 链接静态库

静态库只是一个中间编译状态,并不能直接运行,还需要与调用者编译链接才能运行。应为是中间状态所以在VS2015之前,不同版本VS编译的静态库都不能通用,必须要相同版本才能编译链接。VS2015以后微软队各个版本的静态库abi做了兼容,所以VS2015后大部分静态库可以通用。

如果Debug版C++程序链接Release版静态库时,链接会报错,以下是VS2022的报错:

liba.lib(a.cpp.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(main.cpp.obj 中)
liba.lib(a.cpp.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MD_DynamicRelease”不匹配值“MDd_DynamicDebug”(main.cpp.obj 中)
LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
E:\Study\StudyProject\cmake\lib_debug_release\main.exe : fatal error LNK1319: 检测到 2 个不匹配项

这是因为Debug版和Release版默认使用的vc++ 运行时库不相同,默认情况下Debug版使用/MDd,Release版使用/MD,两者不相同导致报错。

所以在链接库时需要区分Debug版和Release版。在CMake可以如下设置:

target_link_libraries(target $<$<CONFIG:Release>:liba.lib> $<$<CONFIG:Debug>:libad.lib>)

C语言静态库

上面说的都是关于C++的,实际上如果一个库是使用C开发的,那么这个库不会受VC++运行库的影响,也就是说你可以在Debug程序中链接一个C开发的Release的静态库。

很多开源库都是使用C开发的,所以在编译这些库的静态库时,只需要编译一个Release版。

参考

/MD, -MT, -LD (Use Run-Time Library) | Microsoft Learn文章来源地址https://www.toymoban.com/news/detail-754982.html

到了这里,关于MSVC Debug 与 Release 库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio 分别运行flutter 的debug和release版本

    由于在Android Studio 没找到运行release版本的入口,现在通过命令行运行 运行release版本的话直接执行下面命令3 相关命令统计 1.生成apk 2.安装apk: 3.运行release版本

    2024年01月18日
    浏览(45)
  • QtCreator中三种不同编译版本 debug、release、profile 的区别

    debug调试模式,编译后的可执行文件很大,带了很多调试符号信息等,方便开发阶段调试的时候进入具体的堆栈查看值。会打开所有的断言,运行阶段性能差速度慢,可能会有卡顿感觉。 release发布模式,编译后的可执行文件很小,不带任何调试符号信息,一般用于打包发布程

    2024年02月10日
    浏览(43)
  • django-release-debug-apache-mod-wsgi-原理解析

    由于django处理静态资源的效率偏低,顾在release模式不支持静态资源,这种情况需要在apache下配置静态资源路径。在Apache24conf目录下httpd.conf文件中,添加映射,如下所示: 在windows下,mod_wsgi作为一个动态链接库加载进apache内存,如下图所示: mod_wsgi不能作为单独进程运行。

    2024年02月04日
    浏览(40)
  • 2023_4_23_VS下Release怎么打断点进行debug

    🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟 😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆 💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖 今天突

    2023年04月24日
    浏览(24)
  • 在Visual Studio 中,Release、Debug、x86和x64 四个不同的概念

    在 Visual Studio 中,Release、Debug、x86和x64 是四个不同的概念。 Release 和 Debug 是编译的不同配置,用于控制编译器生成的代码和符号信息的方式。 - Release 配置用于生成最终发布版本的代码。在 Release 模式下,编译器会进行各种优化,以提高程序的性能和执行效率。此外,Relea

    2024年02月17日
    浏览(42)
  • bash: cmake: command not found...+++++++lsb_release: command not found

    centos中安装那个cmake。 1、问题 当前系统: 也可能会遇到 lsb_release: command not found 遇到此问题详见 二. bash: lsb_release: command not found错误的解决方法 2、安装cmake 3、测试效果 转载后的博文 -bash: lsb_release: command not found 就是 lsb_release命令没有安装 通过搜索,找到下面文章,文章中

    2024年02月09日
    浏览(40)
  • IDEA Go语言开发环境无法debug调试

    使用idea 搭建go开发环境后如果debug调试可能会遇到错误: could not launch process: decoding dwarf section info at offset 0x0: too short。 有些回答go get -u github.com/derekparker/delve/cmd/dlv 。如果使用go mod方式开发的话这种方式是行不通的,最直接的方法是把dlv项目下载下来自己编译生成dlv.exe。 进

    2024年02月14日
    浏览(47)
  • c++ vscode cmake debug for mac

    1. 下载vscode 2. 安装c++插件 参考:C++ programming with Visual Studio Code 3. 安装llvm,可以使用brew安装 4. 配置llvm到系统环境变量中 5. 编写c++代码 6. 编写CMakeLists.txt文件(前提安装cmake) 7. 生成vscode中c++的智能提示文件c_cpp_properties.json 可参考:https://code.visualstudio.com/docs/cpp/config-clang

    2024年02月08日
    浏览(41)
  • vscode debug with cmake on macos

    for cmake for debugging launch.json \\\"program\\\": \\\"${command:cmake.launchTargetPath}\\\", 这句会通过cmake 来启动要调试的程序, 因为程序是通过CMAKE来build https://vector-of-bool.github.io/docs/vscode-cmake-tools/debugging.html 如果从下面的命令行启动debug, 那么要从settings.json传参

    2024年02月10日
    浏览(41)
  • Vscode使用cmake进行debug的配置教学(教你学会写json配置)

    目前csdn上很多的cmake配置,无论是用插件还是写json,都不太方便,经常配置不成功。 比如想要运行slambook里的一些代码,用传统的配置方案都是建立在工作区就在本文件夹创建。 这样的缺点有: 每次切换工作区都要重新配置,麻烦 每次增加外部连接库都要用pkg去find路径,

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包