windows--cmake与c++的使用教程(10)

1 概述

本节目标:复用cmake脚本文件

2 编写复用脚本

2.1 前言#

  • 多个项目之间,很多cmake设置大相径庭。比如修改输出路径、编写适用与自己的宏或者函数
  • 没错,cmake也可以编写函数和宏。
  • 个人使用习惯,笔者的每个项目都会指定关的文件(exe或者dll文件)的输出路径, cmake设置的脚本如下
Copy Highlighter-hljs
# 64位 if (CMAKE_CL_64) # 设置 可执行程序输出目录 set(publish_bin_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/bin/debug64) set(publish_bin_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/bin/release64) # 设置库文件输出目录 set(publish_lib_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/lib/debug64) set(publish_lib_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/lib/release64) # set(PROJECT_NAME ${PROJECT_NAME}64) # 32 else() # 设置 可执行程序输出目录 set(publish_bin_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/bin/debug) set(publish_bin_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/bin/release) # 设置库文件输出目录 set(publish_lib_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/lib/debug) set(publish_lib_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/lib/release) endif() # 指定可执行程序输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${publish_bin_debug}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${publish_bin_release}) # 指定 库文件输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${publish_lib_debug}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RLEASE ${publish_lib_release})

有待完善--增加编译器名称到路径中。

2.2 编写复用脚本#

  • 手头项目一多,若每次都ctrl+c, ctrl+v, 挺麻烦的,而且也不利于后期维护。
  • 于是自己将其拖动到一个名为 CommonOutput.cmake 的文件中。
  • CommonOutput.cmake 文件内容如下
Copy Highlighter-hljs
# 64位 if (CMAKE_CL_64) # 设置 可执行程序输出目录 set(publish_bin_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/bin/debug64) set(publish_bin_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/bin/release64) # 设置库文件输出目录 set(publish_lib_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/lib/debug64) set(publish_lib_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x64/lib/release64) # set(PROJECT_NAME ${PROJECT_NAME}64) # 32 else() # 设置 可执行程序输出目录 set(publish_bin_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/bin/debug) set(publish_bin_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/bin/release) # 设置库文件输出目录 set(publish_lib_debug ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/lib/debug) set(publish_lib_release ${CMAKE_CURRENT_SOURCE_DIR}/publish/x86/lib/release) endif() # 指定可执行程序输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${publish_bin_debug}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${publish_bin_release}) # 指定 库文件输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${publish_lib_debug}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RLEASE ${publish_lib_release})

没错,就是吧上面的脚本放入了该文件。

2.3 文件夹结构#

  • CommonOutput.cmake 文件位于Common文件夹下
  • 此时,文件夹结构
Copy Highlighter-hljs
. │ CMakeLists.txt │ ├─Common │ CommonOutput.cmake │ └─src main.cc

下一章节介绍如何使用

3 复用脚本#

  • 关键代码:include

3.1 引入脚本#

  • 回到CMakeLists.txt脚本文件,此时文件内容如下
Copy Highlighter-hljs
# 指定CMake脚本解析的最低版本, cmake_minimum_required(VERSION 3.18) # 指定项目 project(HelloCMake) # 指定代码文件 set( src_files ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc ) # 用于生成动态库 add_library(${PROJECT_NAME} SHARED ${src_files})
  • CMakeLists.txt中 增加引入脚本代码, include的参数为: 脚本文件的全路径
Copy Highlighter-hljs
include(${CMAKE_CURRENT_SOURCE_DIR}/Common/CommonOutput.cmake)
  • 增加引用脚本后,此时 CMakeLists.txt 脚本文件完整内容为
Copy Highlighter-hljs
# 指定CMake脚本解析的最低版本, cmake_minimum_required(VERSION 3.18) # 指定项目 project(HelloCMake) # 引入脚本:参数为脚本文件的全路径 include(${CMAKE_CURRENT_SOURCE_DIR}/Common/CommonOutput.cmake) # 指定代码文件 set( src_files ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc ) # 用于生成动态库 add_library(${PROJECT_NAME} SHARED ${src_files})

这样,多个项目可以使用同一个脚本文件中的内容,而不用来回拷贝了

3.2 访问复用脚本中的变量#

  • CMakeLists.txt 引用了脚本,当然,可以访问脚本中定义的变量
  • 下面演示,CMakeLists.txt中输出变量publish_lib_debugpublish_lib_release的值
Copy Highlighter-hljs
message("publish_lib_debug=${publish_lib_debug}") message("publish_lib_release=${publish_lib_release}")
  • 结果
Copy Highlighter-hljs
[cmake] publish_lib_debug=C:/A/publish/x64/lib/debug64 [cmake] publish_lib_release=C:/A/publish/x64/lib/release64

此时,CMakeLists.txt的完整代码为

Copy Highlighter-hljs
# 指定CMake脚本解析的最低版本, cmake_minimum_required(VERSION 3.18) # 指定项目 project(HelloCMake) # 引入脚本:参数为脚本文件的全路径 include(${CMAKE_CURRENT_SOURCE_DIR}/Common/CommonOutput.cmake) # 指定代码文件 set( src_files ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cc ) # 用于生成动态库 add_library(${PROJECT_NAME} SHARED ${src_files}) # 访问脚本中的变量 message("publish_lib_debug=${publish_lib_debug}") message("publish_lib_release=${publish_lib_release}")

5 编译自己的脚本

  • cmake用的多了,会有一套自己的设置,可以考虑将其封装到cmake脚本文件中,放在一个固定的位置,
  • 这样,既方便维护脚本内容,也利于多项目使用, 还有利于后期维护项目。

posted @   mohist  阅读(253)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示
CONTENTS