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

1 概述

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

2 编写复用脚本

2.1 前言

  • 多个项目之间,很多cmake设置大相径庭。比如修改输出路径、编写适用与自己的宏或者函数
  • 没错,cmake也可以编写函数和宏。
  • 个人使用习惯,笔者的每个项目都会指定关的文件(exe或者dll文件)的输出路径, cmake设置的脚本如下
# 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 文件内容如下
# 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文件夹下
  • 此时,文件夹结构
.
│  CMakeLists.txt
│  
├─Common
│      CommonOutput.cmake
│      
└─src
        main.cc

下一章节介绍如何使用

3 复用脚本

  • 关键代码:include

3.1 引入脚本

  • 回到CMakeLists.txt脚本文件,此时文件内容如下
# 指定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的参数为: 脚本文件的全路径
include(${CMAKE_CURRENT_SOURCE_DIR}/Common/CommonOutput.cmake)
  • 增加引用脚本后,此时 CMakeLists.txt 脚本文件完整内容为
# 指定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的值
message("publish_lib_debug=${publish_lib_debug}")
message("publish_lib_release=${publish_lib_release}")
  • 结果
[cmake] publish_lib_debug=C:/A/publish/x64/lib/debug64
[cmake] publish_lib_release=C:/A/publish/x64/lib/release64

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

# 指定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 @ 2022-11-17 23:03  mohist  阅读(240)  评论(0编辑  收藏  举报