CMake生成Debug和Release目标程序时的一些配置

文章介绍

  • 本文章将介绍在Windows和Linux平台,生成可执行程序时,如何设置Debug和Release的一些属性。
  • 主要介绍如何设置目标程序的生成路径,以及运行时库的设置和目标程序版本号的设置。

Debug和Release模式

  • -O,-O1: 这两个命令的效果是一样的,目的都是在不影响编译速度的前提下,尽量采用一些优化算法降低代码大小和可执行代码的运行速度。
  • -O2:该优化选项会牺牲部分编译速度,除了执行-O1所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度。
  • -O3: 该选项除了执行-O2所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度。
  • -Os: -O3的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度,但是这个选项是在-O2的基础之上,尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。

config对应的优化

  • Debug: -g
  • Release: -O3
  • RelWithDebInfo: -O2 -g
  • MinSizeRel: -Os

Linux配置

  • 在CMake中设置
  •   set(CMAKE_BUILD_TYPE Debug)
    
  • 构建时配置
  •   cmake .. -D CMAKE_BUILD_TYPE=Release
    

Windows配置

  • Windows需要在编译时配置生成的类型,默认生成Debug
  • 编译时配置命令。加-v可以看到调试信息。
  •   cmake --build . --config Release -v
    

Debug和Release不同输出路径

  • 执行程序和dll输出
  •   RUNTIME_OUTPUT_DIRECTORY_<CONFIG>
    
  • lib和a库输出
  •   ARCHIVE_OUTPUT_DIRECTORY_<CONFIG>
    
  • so动态库输出
  •   LIBRARY_OUTPUT_DIRECTORY_<CONFIG>
    
  • pdb文件输出
  •   PDB_OUTPUT_DIRECTORY_<CONFIG>
    

debug库名加后缀

  •   set_target_properties(${target} PROPERTIES DEBUG_POSTFIX "d")
    

运行时库设置

  • MSVC_RUNTIME_LIBRARY
  • MultiThreaded(MT): 运行时库静态链接到目标文件。
  • MultiThreadedDLL(MD): 运行时库动态链接到目标文件。
  • MultiThreadedDebug(MTd): 运行时库静态链接到目标文件,加调试信息。
  • MultiThreadedDebugDLL(MDd): 运行时库动态链接到目标文件,加调试信息。
  • 默认运行时库是MD

动态库设置版本号

  • NO_SONAME: NO-不产生动态库的符号链接,OFF - 产生动态库的符号链接
  • VERSION: 整体版本号
  • SOVERSION: 某个库的版本,对可执行程序无效。

示例

示例一:设置编译目标的路径

  • 目录结构
  •   ├── build_linux├── build_win├── CMakeLists.txt├── include│   ├── dlib.h│   └── jlib.h└── src├── dlib.cpp├── jlib.cpp└── main.cpp
    
  • CMakeLists.txt 文件内容
  •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.16)# 构建项目的名称project(cmake_demo)# 包含头文件include_directories(${PROJECT_SOURCE_DIR}/include)# 打印编译类型message("CMAKE_BUILD_TYPE: " ${CMAKE_BUILD_TYPE})# 生成静态库add_library(jlib STATIC ${PROJECT_SOURCE_DIR}/src/jlib.cpp)set(OUT_LIB_PATH ${PROJECT_SOURCE_DIR}/lib)set(OUT_EXE_PATH ${PROJECT_SOURCE_DIR}/exe)# 设置静态库的输出set_target_properties(jlib PROPERTIES# 除了debug和release其他类型库的输出ARCHIVE_OUTPUT_DIRECTORY ${OUT_LIB_PATH}/other# debug库的输出ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debug# release库的输出ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release)# 生成动态库add_library(dlib SHARED ${PROJECT_SOURCE_DIR}/src/dlib.cpp)# 设置动态库的输出set_target_properties(dlib PROPERTIES# windows lib文件输出ARCHIVE_OUTPUT_DIRECTORY ${OUT_LIB_PATH}/otherARCHIVE_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debugARCHIVE_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release# windows dll文件输出RUNTIME_OUTPUT_DIRECTORY ${OUT_EXE_PATH}/other RUNTIME_OUTPUT_DIRECTORY_DEBUG ${OUT_EXE_PATH}/debugRUNTIME_OUTPUT_DIRECTORY_RELEASE ${OUT_EXE_PATH}/release# linux so 文件输出LIBRARY_OUTPUT_DIRECTORY ${OUT_LIB_PATH}/otherLIBRARY_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/debugLIBRARY_OUTPUT_DIRECTORY_RELEASE ${OUT_LIB_PATH}/release# windows pdb文件PDB_OUTPUT_DIRECTORY ${OUT_LIB_PATH}/pdbPDB_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/pdb# debug 版本加后缀DEBUG_POSTFIX "d")# 生成可执行程序add_executable(res ${PROJECT_SOURCE_DIR}/src/main.cpp)# 设置可执行程序的输出set_target_properties(res PROPERTIESRUNTIME_OUTPUT_DIRECTORY ${OUT_EXE_PATH}/other RUNTIME_OUTPUT_DIRECTORY_DEBUG ${OUT_EXE_PATH}/debugRUNTIME_OUTPUT_DIRECTORY_RELEASE ${OUT_EXE_PATH}/release# 设置工作目录# VS_DEBUGGER_WORKING_DIRECTORY ${OUT_EXE_PATH}# 根据不同编译类型,设置不同工作目录# $<IF:1,debug,release> 满足条件,返回debug# $<IF:0,debug,release> 不满足条件,返回releaseVS_DEBUGGER_WORKING_DIRECTORY $<IF:$<CONFIG:Debug>,debug,release># windows pdb文件PDB_OUTPUT_DIaRECTORY ${OUT_LIB_PATH}/pdbPDB_OUTPUT_DIRECTORY_DEBUG ${OUT_LIB_PATH}/pdb# debug 版本加后缀DEBUG_POSTFIX "d")
    
  • 生成Release版本
  •   # Windows 平台在 build_win 下执行cmake ..cmake --build . --config Release# Linux 平台在 build_linux 下执行cmake .. -D CMAKE_BUILD_TYPE=Releasemake
    
  • 生成Debug版本
  •   # Windows 平台在 build_win 下执行cmake ..cmake --build . --config Debug# Linux 平台在 build_linux 下执行cmake .. -D CMAKE_BUILD_TYPE=Debugmake
    
  • 看下最终生成的库目录结构
  •   ├── exe│   ├── debug│   │   ├── dlibd.dll│   │   ├── resd│   │   ├── resd.exe│   └── release│       ├── dlib.dll│       ├── res│       └── res.exe├── lib├── debug│   ├── dlibd.lib│   ├── jlib.lib│   ├── jlib.pdb│   ├── libdlibd.so│   └── libjlib.a├── pdb│   ├── dlibd.pdb│   ├── Release│   └── resd.pdb└── release├── dlib.lib├── jlib.lib├── libdlib.so└── libjlib.a
    

示例一:运行时库设置

  • 这里以Release为例。运行时库默认是动态链接,即 MD
  • cmake中可以设置为静态链接,即 MT
  •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.16)# 构建项目的名称project(cmake_demo)# 包含头文件include_directories(${PROJECT_SOURCE_DIR}/include)# 生成可执行程序add_executable(res ${PROJECT_SOURCE_DIR}/src/main.cpp)# 设置运行时库静态链接MT - 只设置Releaseset_target_properties(res PROPERTIESMSVC_RUNTIME_LIBRARY "MultiThreaded")# 根据编译类型设置# set_target_properties(res PROPERTIES# MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>"# )
    
  • 编译命令
  •   cmake ..cmake --build . --config Release -v
    
  • 先不设置,看下效果
    • 输出信息是 MD
    • 在这里插入图片描述
    • 生成的可执行程序要依赖运行时库,且可执行比较小,为9kb
    • 在这里插入图片描述
  • 设置为MT,再看下效果
    • 输出信息是MT
    • 在这里插入图片描述
    • 没有依赖运行时库,且大小变为 95kb
    • 在这里插入图片描述

示例三:动态库设置版本号

  • cmake文件内容
  •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.16)# 构建项目的名称project(cmake_demo)# 包含头文件include_directories(${PROJECT_SOURCE_DIR}/include)# 生成动态库add_library(dlib SHARED ${PROJECT_SOURCE_DIR}/src/dlib.cpp)# 设置目标程序版本号set_target_properties(dlib PROPERTIESVERSION "1.0.0"SOVERSION "6"NO_SONAME OFF)
    
  • 编译结果
  • 在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381000.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习笔记-C++11中的智能指针

1.智能指针介绍 智能指针是C的特性用法&#xff0c;是一个类似指针功能的类对象&#xff0c;其目的是为了更好的管理动态分配的内存&#xff0c;避免出现内存泄漏、悬空指针等问题。C11的标准库里提供了三种智能指针模板类&#xff0c;分别是std::unique_ptr、std::shared_ptr…

深入解析HNSW:Faiss中的层次化可导航小世界图

层次化可导航小世界&#xff08;HNSW&#xff09;图是向量相似性搜索中表现最佳的索引之一。HNSW 技术以其超级快速的搜索速度和出色的召回率&#xff0c;在近似最近邻&#xff08;ANN&#xff09;搜索中表现卓越。尽管 HNSW 是近似最近邻搜索中强大且受欢迎的算法&#xff0c;…

Flutter动画详解第二篇之显式动画(Explicit Animations)

目录 前言 一、定义 1.AnimationController 1.常用属性 1. value 2. status 3. duration 2.常用方法 1.forward 2.reverse 3.repeat 4.stop 5. reset 6. animateTo(double target, {Duration? duration, Curve curve Curves.linear}) 7.animateBack(double ta…

大数据之写入Doris数据问题

1. 解决Key columns should be a ordered prefix of the schema. KeyColumns[1] (starts from zero) is xxx, but 背景 create table if not exists XXX ( fathercorp varchar(50), id decimalv3(38,0) ) ENGINEOLAP UNIQUE KEY(id) COMMENT xxxx DISTRIBUTED BY HASH(id) BUC…

C#实现数据采集系统-实现功能介绍

系统介绍 我们这里主要使用C#( .Net 6)来实现一个数据采集系统&#xff0c;从0到1搭建数据采集系统&#xff0c;从系统分析&#xff0c;功能拆解&#xff0c;到一一实现 数据采集 数据采集是企业信息化和数字化转型过程中的关键环节&#xff0c;它涉及到从生产设备、传感器…

数据结构之细说链表

1.1顺序表的问题以及思考 经过上一篇顺序表的学习&#xff0c;我们知道顺序表还是有很多缺点 顺序表的缺点&#xff1a; 1.中间/头部的插入删除&#xff0c;实际复杂度为O(N) 2.增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗 3.扩容一般…

实战打靶集锦-31-monitoring

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 ssh服务4.2 smtp服务4.3 http/https服务 5. 系统提权5.1 枚举系统信息5.2 枚举passwd文件5.3 枚举定时任务5.4 linpeas提权 6. 获取flag 靶机地址&#xff1a;https://download.vulnhub.com/monitoring/Monitoring.o…

【BUG】已解决:python setup.py bdist_wheel did not run successfully.

已解决&#xff1a;python setup.py bdist_wheel did not run successfully. 目录 已解决&#xff1a;python setup.py bdist_wheel did not run successfully. 【常见模块错误】 解决办法&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主…

(二)原生js案例之数码时钟计时

原生js实现的数字时间上下切换显示时间的效果&#xff0c;有参考相关设计&#xff0c;思路比较难&#xff0c;代码其实很简单 效果 代码实现 必要的样式 <style>* {padding: 0;margin: 0;}.content{/* text-align: center; */display: flex;align-items: center;justif…

NOIP2015 推销员

这里如果按照距离来考虑就太复杂了&#xff0c;于是转化对象&#xff0c;考虑客户 证明&#xff1a; 假设我们选的疲劳值最大的前X个的最远的一个的距离为 S 1 S_{1} S1​&#xff0c;那么可以知道&#xff0c;一定不会存在一个更优的方案&#xff0c;使得这个方案的最远的距离…

(一)万字长文系列,redolog看这篇就够了 —— redolog的作用?写入方式是什么?什么是日志文件组?redolog的写入策略是怎样的?

导语 MySQL是一种广泛使用的开源关系型数据库管理系统&#xff0c;由瑞典公司MySQL AB开发&#xff0c;现由Oracle公司维护。它以其高性能、可靠性和易用性而著称&#xff0c;广泛应用于各种Web应用程序。MySQL支持多种操作系统&#xff0c;包括Windows、Linux和macOS&#xf…

Kafka Producer发送消息流程之分区器和数据收集器

文章目录 1. Partitioner分区器2. 自定义分区器3. RecordAccumulator数据收集器 1. Partitioner分区器 clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java&#xff0c;中doSend方法&#xff0c;记录了生产者将消息发送的流程&#xff0c;其中有一步…

【自动化测试】几种常见的自动化测试框架

在软件测试领域&#xff0c;自动化测试框架有很多&#xff0c;这里主要介绍几种常用的自动化测试框架。 1.pytest pytest 是 Python 的一种单元测试框架&#xff0c;与 Python 自带的 unittest 测试框架类似&#xff0c;但是比 unittest 框架使用起来更简洁&#xff0c;效率更高…

UDP详细总结

UDP协议特点 UDP是无连接的传输层协议&#xff1b; UDP使用尽最大努力交付&#xff0c;不保证可靠交付&#xff1b; UDP是面向报文的&#xff0c;对应用层交下来的报文&#xff0c;不合并&#xff0c;不拆分&#xff0c;保留原报文的边界&#xff1b; UDP没有拥塞控制&#…

[集成学习]基于python的Stacking分类模型的客户购买意愿分类预测

1 导入必要的库 import pandas as pd import numpy as np import missingno as msno import matplotlib.pyplot as plt from matplotlib import rcParams import seaborn as sns from sklearn.metrics import roc_curve, auc from sklearn.linear_model import LogisticRegres…

【C#】计算两条直线的交点坐标

问题描述 计算两条直线的交点坐标&#xff0c;可以理解为给定坐标P1、P2、P3、P4&#xff0c;形成两条线&#xff0c;返回这两条直线的交点坐标&#xff1f; 注意区分&#xff1a;这两条线是否垂直、是否平行。 代码实现 斜率解释 斜率是数学中的一个概念&#xff0c;特别是…

改变你对文本生成程序的误解!用C++标准库,MinGW情况下,写一个文本生成器(一种AI)

声明:我这个不是那种“文本生成器” 我之前见过那种“自动写作文”的程序,无非就是这样的文章: 文章写的只有主题,没有内容 我曾多次向我的朋友提问他们看没看过那种AI写作的代码,而给我的回复很简单:你弄那玩楞干哈?装*?那玩楞我见过,写的文章空有其表,没有其实;…

Java并发04之线程同步机制

文章目录 1 线程安全1.1 线程安全的变量1.2 Spring Bean1.3 如果保证线程安全 2 synchronized关键字2.1 Java对象头2.1.1 对象组成部分2.1.2 锁类型2.1.3 锁对象 2.2 synchronized底层实现2.2.1 无锁状态2.2.2 偏向锁状态2.2.3 轻量级锁状态2.2.4 重量级锁2.2.5 锁类型总结2.2.…

windows USB 设备驱动开发-编写 UCSI 客户端驱动程序

编写 UCSI 客户端驱动程序 USB Type-C 连接or 系统软件接口&#xff08;UCSI&#xff09;驱动程序充当带有嵌入式控制器&#xff08;EC&#xff09;的 USB Type-C 系统的控制器驱动程序。 如果实现平台策略管理器&#xff08;PPM&#xff09;的系统&#xff0c;如 UCSI 规范中…

国产化低功耗HDMI转VGA方案,大量出货产品,广泛应用在显示器以及广告机产品

芯片描述&#xff1a; 兼具高性能和低成本效益的优点&#xff0c;是一款可以将高清视频 HDMI1.4 数字信号转换成 VGA 模拟信号输出的芯片。不需要提供外部电源&#xff0c;ICNM7301 就可以在正常模式下使用&#xff1b;ICNM7301 广 泛适用于各种市场系统和显示应用体系&#x…