MSVC Debug 与 Release 库

article/2025/10/21 0:57:14

CMake Debug后缀

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

 

链接 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版。


http://chatgpt.dhexx.cn/article/gUD2QgiH.shtml

相关文章

C++ —— 使用msvc编译boost

下载源码 1、选择1.72.0版本进行编译&#xff0c;如图点击Download 2、接着选择zip进行下载 编译源码 1、将下载的boost_1_72_0.zip进行解压。 2、如图&#xff0c;打开vs本地命令工具。并在该终端进入boost_1_72_0.zip进行解压目录中。 3、在终端输入如下指令 // 生成&…

Qt 添加MSVC2017编译器(2022年保姆级教程,不安装完整VS)

目录 0. 前言1. 前期准备2. 安装2.1 安装Qt2.2 安装MSVC编译器和Windows 10 SDK 3. 配置3.1 添加MSVC编译器并选择bat文件3.2 传入脚本文件参数 4. 测试5. 总结 0. 前言 只要是Qt使用者&#xff0c;基本都遇到过安装MSVC编译器的问题。 这个问题似乎有很方便的解决办法&#…

如何用MSVC命令行编译 SQLite ?

作者&#xff1a;cuicui 这个问题的关键是如何配置MSVC 工具&#xff1a;VS2017 要编译的sqlite3源代码从https://www.sqlite.org/download.html下载 官方说明中的方法是 cl shell.c sqlite3.c -Fesqlite3.exe如果没有配置MSVC是无法编译的。经过自己实验&#xff0c;用下面…

在windows下使用MSVC编译ffmpeg

FFmpeg 在windows上面用msvc编译 首先你得准备好msys2环境&#xff0c;安装好对应的工具链&#xff0c;msys2他本身提供了三个环境&#xff0c;但是这次我们是用msvc去编译用哪个环境都无所谓&#xff0c;但是你在哪个环境装的工具链就进入到哪个环境&#xff0c;msys2是环境隔…

Qt Creator配置MSVC编译器

Qt Creator配置MSVC编译器 配置&#xff1a; WINDOWS 7系统4.9.0 Qt CreatorMSVC 2017VS 2017 步骤&#xff1a; VS官网下载Visual Studio Community 2017&#xff0c;在线安装Visual Studio Community2017版本。下载并安装Windows10 SDK, 直接下载.exe版本&#xff0c;然后…

MSVC命令行环境配置

MSVC是微软Windows平台Visual Studio自带的C/C编译器&#xff0c;但是这个IDE比较庞大&#xff0c;有时候我们写一个小程序没有必要去启动IDE&#xff0c;所以可以配置一下MSVC编译器&#xff0c;这样我们就可以通过命令行的方式或者其他一些轻量的工具接入MSVC编译器。 笔者演…

QtCreator配置MSVC

文章目录 1.配置编译器Compiler2.配置调试器(Debugger)3.配置构建套件(Kit) 配置Qt kits需要配置编译器和调试器 1.配置编译器Compiler 配置MSVC需要先下载vs,通过vs安装编译器 具体资料地址 https://www.zhihu.com/question/358058090/answer/1188440282 2.配置调试器(Deb…

Qt离线安装MSVC方法

安装好Qt后&#xff0c;有时候需要用到MSVC编译环境&#xff0c;如果电脑连接了互联网&#xff0c;直接下载安装器在线安装即可&#xff0c;那么需要为没有联网的电脑安装MSVC时&#xff0c;就需要采用下载离线安装包&#xff0c;离线安装的方法&#xff0c;MSVC安装器下载地址…

qt配置msvc

因为mingw是自带的&#xff0c;所以说不用配置直接勾选。但是mingw有一个不足就是有些库用mingw不方便比如opencv。而且web功能&#xff0c;mingw并不支持&#xff0c;今天谈怎么配置msvc。 1.下载vs:重点相关的c和sdk下载 2.下载qt5.14.2之后要自己编译&#xff0c;使用中科…

Qt MSVC开发

环境搭建 安装Virsual Studio&#xff0c;版本可以选择最新版本&#xff0c;我安装的时vs2022&#xff0c;安装时需要勾选 C 桌面开发 安装QT, 下载地址&#xff1a;https://download.qt.io/official_releases/online_installers/&#xff0c;安装时需要选择MSVC 2019 64-bit。…

MSVC编译器介绍

MSVC简介&#xff1a; 与Linux系列操作系统不同&#xff0c;Windows原生环境不提供类似gcc&#xff0c;Clang的C/C语言源程序编译运行工具链。运行在Windows上的IDE&#xff08;集成开发环境&#xff09;&#xff0c;比如CodeBlocks之类&#xff0c;一般都使用MinGW&#xff0…

PAC的编码

PAC的编码 今晚的沙龙讲到了PAC&#xff0c;在此搬运一下比较简单易懂的部分。 PAC的编码是基于类似于两个D触发器的思路&#xff0c;也就是和时序有关。 PAC编码的思路导图&#xff0c;如下所示&#xff1a;

windows 开启pac,完成规则代理

特别鸣谢 10分钟搭建linux代理服务器_三雷科技的博客-CSDN博客 Windows7/10/11 Pac代理脚本及配置_pac脚本_ylf尘风的博客-CSDN博客 1. 代理服务器搭建 yum install tinyproxy代理服务器&#xff0c;配置 编辑配置/etc/tinyproxy/tinyproxy.conf&#xff1a; &#xff08;1&…

解析PAK文件

工具好不好主要看用的人 ----Mantra 众所周知&#xff0c;UE4打包之后生成的资源文件被压缩成.pak格式&#xff0c;那么如何找到合适的工具提取其中的资源呢&#xff1f;&#xff08;既然UE4是开源的&#xff0c;那么UE4的打包工具也应该是开源的&#xff0c;所以大佬们逆流而…

代理自动配置文件PAC的使用方法

注意&#xff1a; 1、微软从Internet Explorer&#xff08;IE&#xff09;11版本开始&#xff0c;已经弃用本地PAC文件的方式&#xff08;也就是我们说的“file://”方式&#xff09;配置自动代理了&#xff0c;只能通过http或者https方式加载代理自动配置的PAC文件 2、 Chrome…

pacp格式文件分析

1 介绍 1.1. 五元组 网络通信过程中会发送大量的请求&#xff0c;每一个请求都需要通过IP数据包进行交互&#xff0c;但是IP数据包的头部信息过于复杂&#xff0c;如果通过IP数据包头进行数据包之间的区分就太复杂了&#xff0c;所以就产生了元组。 五元组是元组中的一种&am…

【pac文件】win10自动配置代理

目的 手动代理&#xff1a;所有地址经过代理&#xff0c;指定ip不经过代理 现在需求&#xff1a;实现指定ip范围才使用该代理 可以通过“自动设置代理”的方式实现 准备 已有代理地址&#xff0c;如&#xff1a;192.168.18.101:808有python环境 自动代理配置 编写sxProxy.…

实战PyQt5: 120-像素图QPixmap和QBitmap

Qt提供了四个用于处理图像数据的类&#xff1a;QImage&#xff0c;QPixmap&#xff0c;QBitmap和QPicture。QImage是为I/O设计的&#xff0c;并且针对直接的像素访问和操作做了优化&#xff0c;QPixmap是为在屏幕上显示图像而设计和优化的。QBitmap为继承自QPixmap的便利类。如…

Qt实战案例(54)——利用QPixmap设计图片透明度

目录 一、项目介绍二、项目基本配置三、UI界面设置四、主程序实现4.1 widget.h头文件4.2 widget.cpp源文件 五、效果演示 一、项目介绍 本文介绍利用QPixmap设计图片透明度&#xff0c;可以看到拖动下方进度条&#xff0c;用于控制上方图片的透明度。 二、项目基本配置 新建…

利用QPixmap显示图片

我们来实现在窗口上显示图片&#xff0c;并将图片进行平移&#xff0c;缩放&#xff0c;旋转和扭曲。这里我是利用QPixmap类来实现图片显示的。 一、利用QPixmap显示图片。 1.将以前的工程文件夹进行复制备份&#xff0c;我们这里将工程文件夹改名为painter05。&#xff08;经…