IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> CMake I 条件控制编译 -> 正文阅读

[开发工具]CMake I 条件控制编译

目录

一、条件控制编译

1.CMakeLists.txt源文件

2.CMake语言说明

(1)set

(2)message

(3)list

(4)if-else-endif

3.构建编译

(1)当USE_LIBRARY为OFF时

(2)当USE_LIBRARY为ON时

?二、条件控制编译

1.CMakeLists.txt

?2.CMake语言说明

(1)option

(2)cmake_dependent_option

3.构建编译

(1)直接无参构建编译

(2) 设置USE_LIBRARY为ON

(3)编译静态库


????????基于上篇文章,我们可以通过条件结构 if-else-endif来控制cmake编译的行为。本文的例子用来实现:

  • 将 Message.h 和 Message.cpp 构建成一个静态库,然后将生成库链接到 helloworld 可执行文件中。
  • 将 Message.h、Message.cpp 和 helloworld.cpp 构建成一个可执行文件,但不生成任何一个库。

一、条件控制编译

1.CMakeLists.txt源文件

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(ifelseStudy LANGUAGES CXX)

#定义新变量 USE_LIBRARY ,这是一个逻辑变量,值为 OFF 
set(USE_LIBRARY OFF)

#打印值
message(STATUS "Compile sources into a library?${USE_LIBRARY}")

#CMake内部 BUILD_SHARED_LIBS 全局变量,设置为 OFF,即生成静态库
set(BUILD_SHARED_LIBS OFF)

#引入一个局部变量_sources,包括 Message.h 和 Message.cpp
list(APPEND 
	_sources 
	Message.cpp 
	Message.h)
	
if(USE_LIBRARY)
		add_library(mylib ${_sources})
		add_executable(helloworldexe helloworld.cpp)
		target_link_libraries(helloworldexe mylib)
else(USE_LIBRARY)#可简写成else()
	add_executable(helloworldexe helloworld.cpp ${_sources})
endif(USE_LIBRARY)#可简写成endif()

2.CMake语言说明

(1)set

set(USE_LIBRARY OFF)

????????定义新变量 USE_LIBRARY,这是一个逻辑变量,其值为OFF。

逻辑真或假可以用多种方式表示:

  • 如果将逻辑变量设置为以下任意一种: 1 、 ON 、 YES 、 true 、 Y 或非零数,则逻辑变量为 true 。
  • 如果将逻辑变量设置为以下任意一种: 0 、 OFF 、 NO 、 false 、 N 、 IGNORE、 NOTFOUND 、空字符串,或者以 -NOTFOUND 为后缀,则逻辑变量为 false。
set(BUILD_SHARED_LIBS OFF)

????????BUILD_SHARED_LIB 是一个CMake全局变量,用于控制cmake是否可以生成动态库,默认情况下BUILD_SHARED_LIB变量为ON。

????????当add_library函数的第二个参数省略、并且没有设置BUILD_SHARED_LIB(即ON),则cmake会生成动态库。

(2)message

message(STATUS "Compile sources into a library?${USE_LIBRARY}")

message([<mode>] "message text" ...)?
????????在日志中记录指定的消息文本,可以通过可选参数mode来设置日志类型,比如STATUS表示用户感兴趣的日志。

(3)list

list(APPEND _sources Message.cpp Message.h)

?????????创建一个局部变量_sources,包括 Message.h 和 Message.cpp。

(4)if-else-endif

????????else(USE_LIBRARY)… endif(USE_LIBIRAY) 可以简写成else() 和 endif() 中的 () ,其历史原因是,因为其能够指出指令的作用范围。

3.构建编译

(1)当USE_LIBRARY为OFF时

(2)当USE_LIBRARY为ON时

?二、条件控制编译

????????上方的代码有个缺陷,就是我们切换生成器行为时需要手动更改CMakeLists.txt中的USE_LIBRARY。option() 命令以选项的形式显示逻辑开关,用于外部设置,可以使用option( )切换构建系统的生成行为。

1.CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(ifelseStudy LANGUAGES CXX)

option(USE_LIBRARY "Compile sources into a library" OFF)

message(STATUS "Compile sources into a library?${USE_LIBRARY}")

include (CMakeDependentOption)

cmake_dependent_option(
	MAKE_STATIC_LIBRARY "Compile sources into a static library" OFF
	"USE_LIBRARY" ON)
	
cmake_dependent_option(
	MAKE_SHARED_LIBRARY "Compile sources into a shared library" ON
	"USE_LIBRARY" ON)
	
message(STATUS "MAKE_STATIC_LIBRARY:" ${MAKE_STATIC_LIBRARY})
message(STATUS "MAKE_SHARED_LIBRARY:" ${MAKE_SHARED_LIBRARY})

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

list(APPEND 
	_sources 
	Message.cpp 
	Message.h)
	
if(USE_LIBRARY)
	if(MAKE_STATIC_LIBRARY)#静态库
		add_library(mylib STATIC ${_sources})
		add_executable(helloworldexe helloworld.cpp)
		target_link_libraries(helloworldexe mylib)
	endif()
	if(MAKE_SHARED_LIBRARY)#动态库
		add_library(mylib SHARED ${_sources})
		add_executable(helloworldexe helloworld.cpp)
		target_link_libraries(helloworldexe mylib)
	endif()
else()
	add_executable(helloworldexe helloworld.cpp ${_sources})
endif()

?2.CMake语言说明

(1)option

option(USE_LIBRARY "Compile sources into a library" OFF)

? ? ? ? 创建一个选项替换上方的 set(USE_LIBRARY OFF) 命令。该选项将修改 USE_LIBRARY 的值,并设置其默认值为 OFF 。

????????option 可接受三个参数: option(<option_variable>?"help string" [initial value])

  • <option_variable>表示该选项的变量的名称。
  • "help string" 用于描述选项,在CMake的终端或图形用户界面中可见。
  • [initial value] 选项的默认值,可以是 ON 或 OFF 。 ?

(2)cmake_dependent_option

????????有时选项之间会有依赖的情况。比如在USE_LIBRARY 设置为ON时,我们提供生成静态库或动态库的选项。CMake提供 cmake_dependent_option() 命令用来定义依赖于其他选项的选项。

????????cmake_dependent_option有五个参数:

cmake_dependent_option(<option> "<help_text>" <value> <depends> <force>)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? 1? ? ? ? ? ? ? ? ? ?2? ? ? ? ? ? ? ? 3? ? ? ? ? ? ? ? 4? ? ? ? ? ? ? ? 5

option(1)的值由depends(4)来决定:当depends(4)为ON时,option(1)的值为value(3);当depends(4)为OFF时,option(1)的值为force(5)。

cmake_dependent_option(
	MAKE_STATIC_LIBRARY "Compile sources into a static library" OFF
	"USE_LIBRARY" ON)
cmake_dependent_option(
	MAKE_SHARED_LIBRARY "Compile sources into a shared library" ON
	"USE_LIBRARY" ON)

????????当USE_LIBRARY为ON时,MAKE_STATIC_LIBRARY为OFF,?MAKE_SHARED_LIBRARY 为ON。

????????当USE_LIBRARY为OFF时,MAKE_STATIC_LIBRARY为ON,?MAKE_SHARED_LIBRARY 为ON。(这时,我们编译出来的仍然是只有一个exe,没关系,我们可以通过-D来设置使其编译固定的库)

3.构建编译

?-D 开关用于为CMake设置任何类型的变量:逻辑变量、路径等。

(1)直接无参构建编译

????????USE_LIBRARY为OFF。

(2) 设置USE_LIBRARY为ON

????????由CMakeLists.txt可知,当USE_LIBRARY为ON时,我们编译动态库。

(3)编译静态库

cmake -D USE_LIBRARY=ON -D MAKE_STATIC_LIBRARY=ON -D MAKE_SHARED_LIBRARY=OFF ..

?

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-01-12 00:12:52  更:2022-01-12 00:14:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:40:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码