首页 > 系统相关 > windows--cmake与c++的使用教程(10)

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

时间:2022-11-17 23:11:38浏览次数:62  
标签:10 set CMAKE lib windows publish CURRENT SOURCE cmake

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脚本文件中,放在一个固定的位置,
  • 这样,既方便维护脚本内容,也利于多项目使用, 还有利于后期维护项目。

标签:10,set,CMAKE,lib,windows,publish,CURRENT,SOURCE,cmake
From: https://www.cnblogs.com/pandamohist/p/16901608.html

相关文章

  • windows 2012 打补丁升级后不能启动处理
    如果可以进入WinRE这个修复的高级选项,选择安全模式,是否可以进入,卸载最近安装的补丁,再重启看一下。如果无法进入安全模式的话,那么选择cmd模式,使用下方命令。这通常会回退pe......
  • IIC从地址之7位,8位和10位详解
    7位寻址在7位寻址过程中,从机地址在启动信号后的第一个字节开始传输,该字节的前7位为从机地址,第8位为读写位,其中0表示写,1表示读。图1:7位寻址。I2C总线规范规定,标准模式I2C......
  • 迟到的windows11虚拟机初体验
    迟到的windows11虚拟机初体验近日微软发布了继win10“最后一个版本”的windows11,相信很多小伙伴早已一睹为快,而我呢当时也是立即就了解到这个事情了,只不过一直没着急真正的......
  • Windows Server独立CA部署
    实验环境如下,要求客户端能https访问web服务。主机IPCA服务器10.0.0.10防火墙网卡1:10.0.0.11网卡2:192.168.230.111Web服务器10.0.0.12客户端(win10)192,168.230.1771.配置Web服......
  • DG搭建过程中备库执行活动复制时报错RMAN-01007、RMAN-01009
    问题描述:DG搭建过程中备库执行活动复制时报错RMAN-01007、RMAN-01009,如下所示:备库参数文件如下:说明:备库参数文件检查后没问题,最终确认到是系统path的问题。因服务器上安装......
  • 100001 求三角形面积已知底高
    <?phpheader('Content-Type:text/html;charset=utf-8');include'./assets/php/head.php';/***求三角形面积已知底高*已知底是30,高是20**/$val='3020';......
  • Lightroom Classic for mac(Lrc2021) 10.3中文直装版
    Lightroom Classic2021中文版为照片展现出摄影效果最佳一面所需的所有桌面编辑工具,包括提亮颜色、使灰暗的摄影更加生动、删除瑕疵、将弯曲的画面拉直等。您可以在电脑桌......
  • FFmpeg Java录制windows USB摄像头
    一、版本<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.8</version></dependency><dependency><g......
  • 百题_每日一题Day10
    暂停一秒输出。1.导入库、调用函数:'''导入函数'''importtime'''调用函数'''time.sleep(1)2.题解:'''导入'''importtime'''初始化'''s='博主不得更点项目咯......
  • 010006 PHP 第一个正式计算长方体的体积公式
    <?phpheader('Content-Type:text/html;charset=utf-8');include'./assets/php/head.php';/***第一个正式计算长方体的体积公式*已知长是47+23,宽是40,高是30......