【CMake系列】08-debug release特性设置
在构建的程序版本中,一共有 debug release minisize relwithDebugInfo四种,其中我们主要使用到就是 debug release 两种,这两种存在着一定的不同,debug 版本 用于调试,有调试信息,方便调试,体积也更大;release版本 用于发布,体积更小;
在使用cmake 针对 debug release 配置时也存在一定的不同,本节,我们就来学习 cmake 构建目标版本 debug release 特性的设置。
本专栏的实践代码全部放在 github 上,欢迎 star !!!
如有问题,欢迎留言、或加群【392784757】交流
CMakeLists.txt 分段给出
目标结构
src/
|---slib.cpp
|---dlib.cpp
|---main.cpp
bin/
|---debug
|---|---main
|---|---dlib.dll
|---release
|---|--- ...
lib/
|---debug
|---|---slib.lib
|---|---dlib.lib
|---|---dlib.so
|---|---slib.a
|--release
|---|--- ...
CMAKE_BUILD_TYPE
linux/ mac 控制方法 vs项目不可用, linux 默认为空, 既不是debug也不是release,设置方式有两种
- set()
- cmake -D CMAKE_BUILD_TYPE=Release
windows vs/nmake,vs 在生成阶段无法控制配置 自动生成4种 编译器选择,构建时指定
cmake --build win --config Release
cmake_minimum_required(VERSION 3.22)
project(cmake_debug_release)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif()
message("CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
静态库构建与属性设置
file(WRITE src/slib.cpp [=[
void slib(){}
]=])
add_library(slib STATIC src/slib.cpp)
#配置输出路径
set(OUT_LIB_PATH ${CMAKE_SOURCE_DIR}/lib)
set(OUT_EXE_PATH ${CMAKE_SOURCE_DIR}/bin)
set_target_properties(slib PROPERTIES
#
ARCHIVE_OUTPUT_DIRECTORY ${OUT_LIB_PATH}
ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debug
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release
)
这里我们定义了两个输出的路径,提供给所有的构建目标使用
- Lib输出路径 set(OUT_LIB_PATH ${CMAKE_SOURCE_DIR}/lib)
- 可执行文件输出路径 set(OUT_EXE_PATH ${CMAKE_SOURCE_DIR}/bin)
动态库构建
file(WRITE include/dlib.h [=[
#ifndef _WIN32 // linux mac unix android
#define CPP_API
#else // windows
#ifdef dlib_EXPORTS
#define CPP_API __declspec(dllexport) // 库项目调用
#else
#define CPP_API __declspec(dllimport) // 调用库项目调用
#endif
#endif
CPP_API void dlib();
]=])
file(WRITE src/dlib.cpp [=[
#include "dlib.h"
void dlib(){}
]=])
add_library(dlib SHARED src/dlib.cpp include/dlib.h)
target_include_directories(dlib PUBLIC include)
动态库的设置注意,为保证在windows下兼容性,要设置宏,将动态库的符号导出
动态库属性设置
set_target_properties(dlib PROPERTIES
# windows lib 文件的输出
ARCHIVE_OUTPUT_DIRECTORY ${OUT_LIB_PATH}
ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debug
ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release
# windows dll文件输出路径
RUNTIME_OUTPUT_DIRECTORY ${OUT_EXE_PATH}
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${OUT_EXE_PATH}/debug
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${OUT_EXE_PATH}/release
# windows pdb 文件
PDB_OUTPUT_DIRECTORY ${OUT_LIB_PATH}/pdb
PDB_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/pdb
#linux .so 和 mac
LIBRARY_OUTPUT_DIRECTORY ${OUT_LIB_PATH}
LIBRARY_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debug
LIBRARY_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release
# debug 版本加后缀
DEBUG_POSTFIX "d"
)
通过
set_target_properties(dlib PROPERTIES
xxx xxx
xxx xxx
)
对动态库的属性进行设置,这里提供了
- windows 下 lib dll pdb
- linux / mac 下 .so
针对 debug 和 release 的路径设置,涉及到的参数有
- ARCHIVE_OUTPUT_DIRECTORY_DEBUG 、ARCHIVE_OUTPUT_DIRECTORY_RELEASE
- RUNTIME_OUTPUT_DIRECTORY_DEBUG、RUNTIME_OUTPUT_DIRECTORY_RELEASE
- PDB_OUTPUT_DIRECTORY_DEBUG
- LIBRARY_OUTPUT_DIRECTORY_DEBUG 、LIBRARY_OUTPUT_DIRECTORY_RELEASE
并针对 构建的debug 版本,添加后缀
DEBUG_POSTFIX "d"
可执行目标构建
file(WRITE src/main.cpp [=[
#include "dlib.h"
void slib();
int main()
{
dlib();
slib();
return 0;
}
]=])
add_executable(main src/main.cpp)
target_include_directories(main PRIVATE include)
target_link_libraries(main slib dlib)
可执行目标属性设置
set_target_properties(main PROPERTIES
# windows/linux 执行文件输出路径
RUNTIME_OUTPUT_DIRECTORY ${OUT_EXE_PATH}
RUNTIME_OUTPUT_DIRECTORY_DEBUG ${OUT_EXE_PATH}/debug
RUNTIME_OUTPUT_DIRECTORY_RELEASE ${OUT_EXE_PATH}/release
# 调试路径
VS_DEBUGGER_WORKING_DIRECTORY ${OUT_EXE_PATH}
# debug release 利用生成器表达式 判断CONFIG 来确定
VS_DEBUGGER_WORKING_DIRECTORY ${OUT_EXE_PATH}/$<IF:$<CONFIG:Debug>,debug,release>
)
if(MSVC)
set_target_properties(main PROPERTIES
# windows debug 版本加后缀
DEBUG_POSTFIX "d"
)
endif()
针对 可执行目标的 debug 和 release 特性,设置对应的输出路径
RUNTIME_OUTPUT_DIRECTORY_DEBUG 、RUNTIME_OUTPUT_DIRECTORY_RELEASE
在windows下,使用vs 进行调试,需要合理设置对应路径,否则会出现找不到的情况,这里通过生成表达式实现 根据配置 设置 debug 目录
VS_DEBUGGER_WORKING_DIRECTORY ${OUT_EXE_PATH}
# debug release 利用生成器表达式 判断CONFIG 来确定
VS_DEBUGGER_WORKING_DIRECTORY ${OUT_EXE_PATH}/$<IF:$<CONFIG:Debug>,debug,release>
)
并对 windows 下 可执行目标 debug版本 添加后缀
if(MSVC)
set_target_properties(main PROPERTIES
# windows debug 版本加后缀
DEBUG_POSTFIX "d"
)
endif()
【CMake系列】08-debug release特性设置的更多相关文章
- ASP.NET Web API实践系列04,通过Route等特性设置路由
ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一 ...
- VS2008 如何将Release版本设置可以调试的DEBUG版本
VS2008 如何将Release版本设置可以调试的DEBUG版本 只需设置三个部分: 项目->属性->C/C++->General->Debug Information Fo ...
- C#程序集系列08,设置程序集版本
区别一个程序集,不仅仅是程序集名称,还包括程序集版本.程序集公匙.程序集文化等,本篇体验通过界面和编码设置程序集版本. □ 通过Visual Studio设置程序集版本 →右键项目,选择"属 ...
- [iOS开发系列]根据Debug和Release状态的变化来屏蔽日志输出
今天在这里分享一个很实用的小技巧. 我们平时在开发应用的时候,经常会用到NSLog来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理. 我们在发布正式版的时候一定要屏蔽掉所有 ...
- Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)
概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...
- 3. CMake 系列 - 分模块编译&安装项目
目录 1. 项目目录结构 2. 相关代码 2.1 add 模块 2.2 sub 模块 2.3 测试模块 2.4 顶层 CMakeLists.txt 3. 编译 & 安装 4. 项目安装基本语法 ...
- Java 集合系列 08 Map架构
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- java io系列08之 File总结
本文对File的API和常用方法进行介绍. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_08.html File 介绍 File 是“文件”和“目 ...
- 9.9 翻译系列:数据注解特性之--MaxLength 【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/maxlength-minlength-dataannotations-attribut ...
- 9.3 翻译系列:数据注解特性之Key【EF 6 Code-First 系列】
原文链接:http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.a ...
随机推荐
- Golang支持重试的http客户端ghttp
简介 官方仓库:https://github.com/GuoFlight/ghttp 重试的逻辑依赖了github.com/avast/retry-go 入门 client := ghttp.Clie ...
- Electron 的 安装
背景 因为搞嵌入式开发的时候,每次烧写不同版本的固件的时候,经常需要重命名,有时候烧错版本我也不知道: 因此我认为对固件的管理比较麻烦,所以我希望能够有一个比较好的工具来做管理,找了一圈没有发现合适的 ...
- IgH EtherCAT主站开发案例分享——基于NXP i.MX 8M Mini
前 言 本文档主要演示NXP i.MX 8M Mini工业开发板基于IgH EtherCAT控制伺服电机. 演示板卡是创龙科技的TLIMX8-EVM工业开发板,它是基于NXP i.MX 8M M ...
- ARM+DSP异构多核——全志T113-i+玄铁HiFi4核心板规格书
核心板简介 创龙科技SOM-TLT113是一款基于全志科技T113-i双核ARM Cortex-A7 + 玄铁C906 RISC-V + HiFi4 DSP异构多核处理器设计的全国产工业核心板,ARM ...
- 【VMware vSAN】vSAN Data Protection Part 1:安装部署。
VMware vSAN 8 U3 中新引入了基于 vSAN ESA 的全新 vSAN Data Protection 功能,借助 vSAN Data Protection 功能,您可以使用在 vSAN ...
- 【Python】基于动态规划和K聚类的彩色图片压缩算法
引言 当想要压缩一张彩色图像时,彩色图像通常由数百万个颜色值组成,每个颜色值都由红.绿.蓝三个分量组成.因此,如果我们直接对图像的每个像素进行编码,会导致非常大的数据量.为了减少数据量,我们可以尝试减 ...
- GCC8 编译优化 BUG 导致的内存泄漏
1. 背景 1.1. 接手老系统 最近我们又接手了一套老系统,老系统的迭代效率和稳定性较差,我们打算做重构改造,但重构周期较长,在改造完成之前还有大量的需求迭代.因此我们打算先从稳定性和迭代效率出发做 ...
- oeasy 教您玩转 linux 之 010302 火狐浏览器 firefox
我们来回顾一下 上一部分我们都讲了什么? oneko xeyes 这次看看这个火狐 火狐 看看当前版本 看看是否可以更新 如果需要更新就更新 firefox -v apt search f ...
- Web 开发技术栈
Web 开发技术栈 Web 是什么? 简单地说,网络是一个遍布全球的网络,它连接大量设备并允许它们相互通信 Internet 上的网站托管在称为服务器的设备上,当与 Internet 上的网页交互时, ...
- 使用win server 2019服务器的iis服务发布静态网页
1.首先远程连接到服务器 2.打开服务器管理器 3添加角色和功能 4.安装类型:选择基于角色或基于功能的安装 →服务器角色:从服务器池中选择服务器 5.服务器角色选择Web服务器(iis) 6.功能 ...