在构建的程序版本中,一共有 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 的路径设置,涉及到的参数有

  1. ARCHIVE_OUTPUT_DIRECTORY_DEBUG 、ARCHIVE_OUTPUT_DIRECTORY_RELEASE
  2. RUNTIME_OUTPUT_DIRECTORY_DEBUG、RUNTIME_OUTPUT_DIRECTORY_RELEASE
  3. PDB_OUTPUT_DIRECTORY_DEBUG
  4. 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特性设置的更多相关文章

  1. ASP.NET Web API实践系列04,通过Route等特性设置路由

    ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程.在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一 ...

  2. VS2008 如何将Release版本设置可以调试的DEBUG版本

    VS2008 如何将Release版本设置可以调试的DEBUG版本 只需设置三个部分: 项目->属性->C/C++->General->Debug Information Fo ...

  3. C#程序集系列08,设置程序集版本

    区别一个程序集,不仅仅是程序集名称,还包括程序集版本.程序集公匙.程序集文化等,本篇体验通过界面和编码设置程序集版本. □ 通过Visual Studio设置程序集版本 →右键项目,选择"属 ...

  4. [iOS开发系列]根据Debug和Release状态的变化来屏蔽日志输出

    今天在这里分享一个很实用的小技巧. 我们平时在开发应用的时候,经常会用到NSLog来调试我们的程序,而随着项目越来越大,这些用于调试的日志输出就会变得很难管理. 我们在发布正式版的时候一定要屏蔽掉所有 ...

  5. Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...

  6. 3. CMake 系列 - 分模块编译&安装项目

    目录 1. 项目目录结构 2. 相关代码 2.1 add 模块 2.2 sub 模块 2.3 测试模块 2.4 顶层 CMakeLists.txt 3. 编译 & 安装 4. 项目安装基本语法 ...

  7. Java 集合系列 08 Map架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. java io系列08之 File总结

    本文对File的API和常用方法进行介绍. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/io_08.html File 介绍 File 是“文件”和“目 ...

  9. 9.9 翻译系列:数据注解特性之--MaxLength 【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/maxlength-minlength-dataannotations-attribut ...

  10. 9.3 翻译系列:数据注解特性之Key【EF 6 Code-First 系列】

    原文链接:http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.a ...

随机推荐

  1. MYSQL-check管理

    mysql这个东西对于管理员并不友好,看起来还没有成品.就拿亲儿子workbeanch来说吧,功能也不是很齐全,速度也一般般,否则sqlyog之类的早没有什么活路了. 社区版的支持非常薄弱(商业版不太 ...

  2. Wireshark找不到接口

    在管理员权限下的命令行窗口输入net start npf即可. 注意是管理员权限下的,否则会拒绝访问.

  3. 【动手学深度学习】第五章笔记:层与块、参数管理、自定义层、读写文件、GPU

    为了更好的阅读体验,请点击这里 由于本章内容比较少且以后很显然会经常回来翻,因此会写得比较详细. 5.1 层和块 事实证明,研究讨论"比单个层大"但"比整个模型小&quo ...

  4. .NET Core 中生成验证码

    在开发中,有时候生成验证码的场景目前还是存在的,本篇演示不依赖第三方组件,生成随机验证码图片. 先添加验证码接口 public interface ICaptcha { /// <summary ...

  5. Ubuntu下的NVIDIA显卡【驱动&CUDA 安装与卸载】

    碎碎念:主要是把显卡相关的整合出来,基础知识后面再放上来 显卡安装后可以有效降低电脑开太多界面卡顿hhh现象,不过如果显卡不好的话或者是独显的话 问题也不大,主要是学习 learning 使用 参考资 ...

  6. yb课堂 开发前端项目路由 《三十五》

    Vue-Router开发前端项目路由 vue-router 是Vue.js官方的路由管理器,它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌 官方文档:https://router.vue ...

  7. 使用bootstrap-select 动态加载数据不显示的问题,级联数据置为空

    动态加载数据 $.showLoading('数据加载中');//开启遮挡层 $.ajax({ url: "/PickoutStock/GetSendReceive", data: ...

  8. 动手学Avalonia:基于硅基流动构建一个文生图应用(一)

    文生图 文生图,全称"文字生成图像"(Text-to-Image),是一种AI技术,能够根据给定的文本描述生成相应的图像.这种技术利用深度学习模型,如生成对抗网络(GANs)或变换 ...

  9. 机器学习策略篇:详解数据分布不匹配时,偏差与方差的分析(Bias and Variance with mismatched data distributions)

    详解数据分布不匹配时,偏差与方差的分析 估计学习算法的偏差和方差真的可以帮确定接下来应该优先做的方向,但是,当训练集来自和开发集.测试集不同分布时,分析偏差和方差的方式可能不一样,来看为什么. 继续用 ...

  10. 2024 年 Visual Studio 实用插件集合

    前言 在软件开发领域,选择正确的工具可以极大地提升开发效率和质量. Visual Studio作为微软推出的强大集成开发环境(IDE),通过安装合适的插件,可以进一步增强其功能,满足开发者多样化的需求 ...