CMake:构建类型(Debug、Release以及其他)

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

@TOC

导言

我们前几篇的学习基本上可以完整构建项目和库了,接下来我们将基于第三篇的内容进行修改和补充,不断的完善各种学到的内容。

基本概念构建类型

CMake可以识别的构建类型是:

  • Debug:用于在没有优化的情况下,使用带有调试符号构建库或者可执行文件
  • Release: 用于构建的优化的库或者可执行文件,不包含调试符号
  • RelWithDebInfo:用于构建较少的优化库或者可执行文件,包含调试符号
  • MinSizeRel:用于不增加目标代码大小的优化方式,来构建库或者可执行文件

控制生成构建系统使用的配置变量是CMAKE_BUILD_TYPE,该变量默认为空。

这里我们仍然选择CMake第三篇—动态库和静态库的补充中的代码,但是这里我们对CMakeLists.txt稍作修改。

项目结构

.
├── cmake
│   └── message_config.cmake.in
├── message-module
│   ├── CMakeLists.txt
│   ├── include
│   │   ├── message_export_lib.h
│   │   └── message.h
│   └── src
│       └── message.cpp
├── CMakeLists.txt
└── hello_world.cpp

4 directories, 9 files

项目源码:
https://gitee.com/jiangli01/tutorials/tree/master/cmake-tutorial/chapter1/12

message-module模块下的CMakeLists.txt

file(GLOB SOURCE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)

if (BUILD_SHARED_LIBS)
    add_library(test_message SHARED ${SOURCE_FILE})
    target_compile_definitions(test_message PUBLIC -DMESSAGE_LIB_SHARED_BUILD)
    target_compile_definitions(test_message PRIVATE -DMESSAGE_LIB_EXPORTS)
else()
    add_library(test_message STATIC ${SOURCE_FILE})
endif()

# 添加别名,以便库可以在构建树中使用,例如在测试时
add_library(test_message::test_message ALIAS test_message)

target_include_directories(test_message
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/include
    $<INSTALL_INTERFACE:include>
)

set_target_properties(test_message PROPERTIES 
    CXX_STANDARD 11
    CMAKE_CXX_STANDARD_REQUIRED True
)

set_target_properties(test_message PROPERTIES
    DEBUG_POSTFIX "_debug"
    RELEASE_POSTFIX "_release"
)

install(TARGETS test_message
        EXPORT message_export_target
        RUNTIME DESTINATION "bin"
        LIBRARY DESTINATION "lib"
        ARCHIVE DESTINATION "lib"
)

install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ 
        DESTINATION "include"
        FILES_MATCHING PATTERN "*.h"
)

install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ 
        DESTINATION "include"
        FILES_MATCHING PATTERN "*.hpp"
)

install(EXPORT message_export_target
        FILE message_lib.cmake
        DESTINATION lib/cmake/test_message
)


include(CMakePackageConfigHelpers)
# generate the config file that is includes the exports
configure_package_config_file(
    ${CMAKE_SOURCE_DIR}/cmake/message_config.cmake.in
    "${CMAKE_SOURCE_DIR}/cmake/message_config.cmake"
    INSTALL_DESTINATION "lib/cmake/test_message"
)

# generate the version file for the config file
write_basic_package_version_file(
    "${CMAKE_SOURCE_DIR}/cmake/message_config_version.cmake"
    VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}"
    COMPATIBILITY AnyNewerVersion
)

install(FILES
    ${CMAKE_SOURCE_DIR}/cmake/message_config.cmake
    ${CMAKE_SOURCE_DIR}/cmake/message_config_version.cmake
    DESTINATION lib/cmake/test_message
)

export(EXPORT message_export_target FILE ${CMAKE_SOURCE_DIR}/cmake/message_config_version.cmake)

这里,我们基本上没有做修改,只添加了以下内容:

set_target_properties(test_message PROPERTIES
    DEBUG_POSTFIX "_debug"
    RELEASE_POSTFIX "_release"
)

这将在 debug 构建模式下将库名后缀设置为 _debug,在 release 构建模式下将库名后缀设置为 _release。然后,可以使用 test_message_debugtest_message_release 来引用库。当然,我们其实可以使用find_package,然后直接使用库的别名test_message即可。

根目录下的CMakeLists.txt

cmake_minimum_required(VERSION 3.10 FATAL_ERROR)

project(hello-world LANGUAGES CXX)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

option(BUILD_SHARED_LIBS "Specifies the type of libraries (SHARED or STATIC) to build" OFF)

# Set install direcotory
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/output/)
endif()

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
message(STATUS "Build type:                                       ${CMAKE_BUILD_TYPE}")
message(STATUS "C flags, Debug configuration:                     ${CMAKE_C_FLAGS_DEBUG}")
message(STATUS "C flags, Release configuration:                   ${CMAKE_C_FLAGS_RELEASE}")
message(STATUS "C flags, Release configuration with Debug info:   ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
message(STATUS "C flags, minimal Release configuration:           ${CMAKE_C_FLAGS_MINSIZEREL}")
message(STATUS "C++ flags, Debug configuration:                   ${CMAKE_CXX_FLAGS_DEBUG}")
message(STATUS "C++ flags, Release configuration:                 ${CMAKE_CXX_FLAGS_RELEASE}")
message(STATUS "C++ flags, Release configuration with Debug info: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
message(STATUS "C++ flags, minimal Release configuration:         ${CMAKE_CXX_FLAGS_MINSIZEREL}")

add_subdirectory(${CMAKE_SOURCE_DIR}/message-module)

include_directories(
    ${CMAKE_SOURCE_DIR}/message-module/include
)

add_executable(
    ${PROJECT_NAME}
    ${CMAKE_SOURCE_DIR}/hello_world.cpp
) 

target_link_libraries(
    ${PROJECT_NAME}
    test_message   
)

这里,我们添加了以下内容:

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
message(STATUS "Build type:                                       ${CMAKE_BUILD_TYPE}")
message(STATUS "C flags, Debug configuration:                     ${CMAKE_C_FLAGS_DEBUG}")
message(STATUS "C flags, Release configuration:                   ${CMAKE_C_FLAGS_RELEASE}")
message(STATUS "C flags, Release configuration with Debug info:   ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
message(STATUS "C flags, minimal Release configuration:           ${CMAKE_C_FLAGS_MINSIZEREL}")
message(STATUS "C++ flags, Debug configuration:                   ${CMAKE_CXX_FLAGS_DEBUG}")
message(STATUS "C++ flags, Release configuration:                 ${CMAKE_CXX_FLAGS_RELEASE}")
message(STATUS "C++ flags, Release configuration with Debug info: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
message(STATUS "C++ flags, minimal Release configuration:         ${CMAKE_CXX_FLAGS_MINSIZEREL}")

首先,检查是否设置了构建类型。如果没有,则将构建类型设置为 Release。然后,它使用 message 命令输出各种编译标志,包括 CC++DebugRelease 配置,以及最小 Release 配置和带有调试信息的 Release 配置。这些信息对于调试和优化构建非常有用。

验证输出

我们执行以下命令,这里没有指定构建类型,即默认构建类型为Release

mkdir build
cd build
cmake ..
-- The CXX compiler identification is GNU 9.4.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Build type:                                       Release
-- C flags, Debug configuration:                     
-- C flags, Release configuration:                   
-- C flags, Release configuration with Debug info:   
-- C flags, minimal Release configuration:           
-- C++ flags, Debug configuration:                   -g
-- C++ flags, Release configuration:                 -O3 -DNDEBUG
-- C++ flags, Release configuration with Debug info: -O2 -g -DNDEBUG
-- C++ flags, minimal Release configuration:         -Os -DNDEBUG
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/build
make
Scanning dependencies of target test_message
[ 25%] Building CXX object message-module/CMakeFiles/test_message.dir/src/message.cpp.o
[ 50%] Linking CXX static library ../lib/libtest_message_release.a
[ 50%] Built target test_message
Scanning dependencies of target hello-world
[ 75%] Building CXX object CMakeFiles/hello-world.dir/hello_world.cpp.o
[100%] Linking CXX executable bin/hello-world
[100%] Built target hello-world

可以看到,我们执行make命令后,生成的库命名为libtest_message_release.a,并将其存入lib目录中。

make install
[ 50%] Built target test_message
[100%] Built target hello-world
Install the project...
-- Install configuration: "Release"
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/libtest_message_release.a
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/include
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/include/message_export_lib.h
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/include/message.h
-- Up-to-date: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/include
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/cmake/test_message/message_lib.cmake
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/cmake/test_message/message_lib-release.cmake
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/cmake/test_message/message_config.cmake
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/cmake/test_message/message_config_version.cmake
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
-- The CXX compiler identification is GNU 9.4.0
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Build type:                                       Debug
-- C flags, Debug configuration:                     
-- C flags, Release configuration:                   
-- C flags, Release configuration with Debug info:   
-- C flags, minimal Release configuration:           
-- C++ flags, Debug configuration:                   -g
-- C++ flags, Release configuration:                 -O3 -DNDEBUG
-- C++ flags, Release configuration with Debug info: -O2 -g -DNDEBUG
-- C++ flags, minimal Release configuration:         -Os -DNDEBUG
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/build
make
[ 25%] Building CXX object message-module/CMakeFiles/test_message.dir/src/message.cpp.o
[ 50%] Linking CXX static library ../lib/libtest_message_debug.a
[ 50%] Built target test_message
[ 75%] Building CXX object CMakeFiles/hello-world.dir/hello_world.cpp.o
[100%] Linking CXX executable bin/hello-world
[100%] Built target hello-world

可以看到,我们执行make命令后,生成的库命名为libtest_message_debug.a,并将其存入lib目录中。

make install
Install the project...
-- Install configuration: "Debug"
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/libtest_message_debug.a
-- Up-to-date: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/include
-- Up-to-date: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/include/message_export_lib.h
-- Up-to-date: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/include/message.h
-- Up-to-date: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/include
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/cmake/test_message/message_lib.cmake
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/cmake/test_message/message_lib-debug.cmake
-- Up-to-date: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/cmake/test_message/message_config.cmake
-- Installing: /home/jiangli/repo/tutorials/cmake-tutorial/chapter1/12/output/lib/cmake/test_message/message_config_version.cmake

补充

ReleaseDebug在构建项目通常很有用,如评估编译器优化级别的效果。对于单配置生成器,如Unix MakefileMSYS Makefile或者Ninja,因为要对项目重新配置,这里需要运行CMake两次。

不过,CMake也支持符合配置生成器。这些通常是集成开发环境提供的项目文件,最显著的是Visual StudioXCode,它们可以同时处理多个配置。可以使用CMAKE_CONFIGURATION_TYPES变量对这些生成器的可用配置进行调整。

$ mkdir -p build
$ cd build
$ cmake .. -G"Visual Studio 14 2019 Win64" -D CMAKE_CONFIGURATION_TYPES="Release;Debug"

将为ReleaseDebug配置生成一个构建树。然后,您可以使–config标志来决定构建这两个中的哪一个:文章来源地址https://www.toymoban.com/news/detail-450430.html

$ cmake --build . --config Release

到了这里,关于CMake:构建类型(Debug、Release以及其他)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SpringBoot及其他框架乱码问题的原因和解决

    乱码问题是指当我们在浏览器或者其他客户端发送或接收数据时,由于编码格式不一致或者不正确,导致数据显示为一些无法识别的字符,如 ???? 或者 鍙戠敓涓枃涔辩爜闂 。这种问题会影响用户体验和数据传输的准确性。 乱码问题的根本原因是编码格式不匹配。编码

    2024年02月10日
    浏览(48)
  • RabbitMQ和spring boot整合及其他内容

    在现代分布式应用程序的设计中,消息队列系统是不可或缺的一部分,它为我们提供了解耦组件、实现异步通信和确保高性能的手段。RabbitMQ,作为一款强大的消息代理,能够协助我们实现这些目标。在本篇CSDN博客中,我们将探讨一些高级主题,包括RabbitMQ与Spring Boot的整合、

    2024年02月07日
    浏览(43)
  • CMake 学习笔记(控制生成 Release 和 Debug)

    CMake 支持4中Build type。分别是: Debug : 调试模式,带调试信息,没有任何的优化 Release : 没有调试信息,速度优化 RelWithDebInfo:执行部分的优化,带有调试信息 MinSizeRel : 生成的可执行文件的体积最小 下面的例子使用 MSYS2 里面的cmake 来演示。 用个非常简单的例子: CMake

    2024年02月12日
    浏览(35)
  • 基于Pytorch的身份证及其他证件检测矫正模型应用

    前言         在做身份证和其他证件识别的时候,图片基本都不是摆正的状态,此时在进行OCR文字识别的提取文字信息的时候会出现很多误差,如何将证件摆正,再进行OCR文字识别就可以大大提高准确率。 准备工作  1、Python环境,在Python官网下载安装 2、项目代码,下载地

    2024年01月19日
    浏览(66)
  • [记录]Cloudflare之WARP及其他app的DNS测试

    (本文仅作研究学习安全连接使用,无非法用途) 本人用的是苹果手机,如果想用机场需要买小飞机,恰恰又没Visa卡。 用第三方客户端罢,还靠不住。 于是我就想到了GFW的工作方式: DNS拦截,SNI审查,IP黑洞。 除了谷歌系网站全部是IP黑洞(况且我也不经常用),其他的基

    2024年02月08日
    浏览(40)
  • uniapp h5 echarts 打包后图表点击失效/及其他失效

    pc端 window11 hbuilderx版本 3.8.12 echarts版本 5.4.3 在main.js 加上 window.wx = {} // 开发正常 打包后 图表点击等也会失效 window.wx = null 会报错 打包后自动检测环境,会优先走到 wx里去。进去就不出来了。拉都拉不出来那种。所以重写一下wx

    2024年02月08日
    浏览(40)
  • PyTorch入门学习(十一):神经网络-线性层及其他层介绍

    目录 一、简介 二、PyTorch 中的线性层 三、示例:使用线性层构建神经网络 四、常见的其他层 一、简介 神经网络是由多个层组成的,每一层都包含了一组权重和一个激活函数。每层的作用是将输入数据进行变换,从而最终生成输出。线性层是神经网络中的基本层之一,它执

    2024年02月05日
    浏览(38)
  • 搜索引擎的基本原理、算法、用户画像及其他相关知识点

    作者:禅与计算机程序设计艺术 作为一个互联网公司,无疑需要做好搜索引擎的运营。每天都要搜索很多信息,如何做好搜索引擎的用户体验,提高用户的转化率是每家公司的核心竞争力。但实际上,做好搜索引擎运营也不是一件容易的事情,因为搜索引擎的特性、相关性算

    2024年02月04日
    浏览(62)
  • Win11自带微软输入法怎么输入π及其他希腊字母

    如果用搜狗等第三方输入法的话就没有这些问题了,各种符号很方便。 自带的输入法输入 pi 和 pai 都不能正常输入 π pi π 参考文章 https://www.cnblogs.com/qq-757617012/p/14078133.html 如果用自带的输入法可以采用以下方式 输入 uuxl xl表示“希腊”,即可看到各种希腊字母,其中即包括

    2024年02月09日
    浏览(62)
  • 【Vue3】vue3中的watchEffect使用及其他的API

    目录  一,watchEffect 二,生命周期 三,什么是hooks? 四,toRef  五,其他组合式API 5.1shallowReactiveshallowRef 5.2readonlyshallowReadonly 5.3.toRawmarkRaw 5.4自定义Ref-customRef ​5.5provide$inject 5.6响应式数据的判断 写在最后     1.watch: 既要指明监视的属性,也要指明监视的回调。 2.watchEffect: 不

    2024年02月01日
    浏览(61)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包