编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

7、Tars C++系列之依赖CMake(三)(cmake 依赖另一个共享库)

wxchong 2024-07-08 01:18:13 开源技术 62 ℃ 0 评论

继上一篇文章(点击查看),继续吧。

上一篇提到CMake除了是一个命令行工具外,也是一门图灵完备的语言。

那针对语言关键字,继续深入了解一下语言特性吧。

学习任何一门语言,一般都先学以下输出,即打印消息到控制台。

这里也不例外。

1、输出信息message

1.1、格式:

message([<mode>] "message to display" ...)

mode是可选,message可变参数,即可以是一个参数,也可以是多个参数。

1.2、新建一个空工程测试下吧

mkdir -p /home/lirizhong/cmake/src/message
cd /home/lirizhong/cmake/src/message

新建CMakeLists.txt源代码文件,内容如下:

cmake_minimum_required(VERSION 3.10)

project("message")

message("-------------------------------------------------")
message("hello" " " "world")
message("-------------------------------------------------")

1.3、开始构建,即执行CMake语言程序。

mkdir build
cd build
cmake ..

输出内容:

...
-------------------------------------------------
hello world
-------------------------------------------------
  ...

至于mode参数,可以自己试下:

(none)         						= 重要信息
STATUS         				= 提醒信息
WARNING        		= 警告信息,会继续执行
AUTHOR_WARNING = 警告信息,会继续执行
SEND_ERROR     =  错误信息,会继续执行,但跳过生成
FATAL_ERROR    = 致命错误信息,停止执行

2、变量

CMake变量只支持一种基础数据类型,那就是字符串,虽然有不少的函数、宏可以将字符串转换成其他类型,但对CMake来说就只有一种数据类型。

2.1、说明

通过set命令可设置变量,${变量名}可获取变量值。

变量的作用域包括3种:

2.2、函数作用域

在function内部声明的变量

function(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
endfunction(<name>)

2.3、目录作用域

CMake工程就是一个目录树,每个需要构建的目录有CMakeLists.txt文件,CMake在加载CMakeLists.txt后,会自动为该目录维护以下CMake预定义的变量,当然,CMakeLists.txt也可以定义业务侧的变量,或者为CMake预定义的变量重新赋值。然后对子目录而言,先继承父目录的所有变量,然后针对一些变量设置为子目录作用域。

2.4、Cache域

即多个子工程间共享,只要在一个工程内声明了,其他子工程就能读取到。

声明变量:

2.5、普通变量

格式:

set(<variable> <value>... [PARENT_SCOPE])

需要说明的是如果使用了PARENT_SCOPE,则把变量作用域提升到父亲作用域。很少用这个特性。一般都是set(变量名称 "变量值")。

2.6、Cache变量

格式:

set(<variable> <value>... CACHE <type> <docstring> [FORCE])

Cache变量提供了能力,用于可以通过“cmake -D变量名=变量值“修改,而不是使用代码设置的值,除非使用强制参数FORCE。docstring一般使用一段字符串描述该变量的用途。而类型type包括如下值:

BOOL
Boolean ON/OFF value

FILEPATH
Path to a file on disk

PATH
Path to a directory on disk

STRING

2.7、环境变量

格式:

set(ENV{<variable>} <value>...)

实践一下吧:

2.7.1、验证函数作用域

修改CMakeLists.txt源代码文件,内容如下:

cmake_minimum_required(VERSION 3.10)

project("variable")

function(tars_build_server APP SERVER)
  set(TARS_PATH "/usr/local/tars/cpp")
endfunction(tars_build_server)

tars_build_server("example" "HelloServer")

message("-------------------------------------------------")
message("TARS_PATH:"        ${TARS_PATH})
message("-------------------------------------------------")

set(TARS_PATH "/usr/local/tars/cpp")

message("\n")
message("-------------------------------------------------")
message("TARS_PATH:"        ${TARS_PATH})
message("-------------------------------------------------")

构建运行看下:

cmake ..

输出内容:

...
-------------------------------------------------
TARS_PATH:       
-------------------------------------------------

-------------------------------------------------
TARS_PATH:       /usr/local/tars/cpp
-------------------------------------------------
  ...

2.7.2、验证Cache作用域

修改CMakeLists.txt源代码文件,内容如下:

cmake_minimum_required(VERSION 3.10)

project("variable")

set(TARS_PATH "/usr/local/tars/cpp" CACHE PATH "Set Tars Install Path")

message("-------------------------------------------------")
message("TARS_PATH:       ${TARS_PATH}")
message("-------------------------------------------------")

构建运行看下:

cmake ..

输出内容:

...
-------------------------------------------------
TARS_PATH:       /usr/local/tars/cpp
-------------------------------------------------
  ...

构建运行看下:

cmake .. -DTARS_PATH=/home/lirizhong/tars/cpp

输出内容:

...
-------------------------------------------------
TARS_PATH:       /home/lirizhong/tars/cpp
-------------------------------------------------
  ...

2.7.3、验证获取变量值

上面已经有获取变量值的代码了,这里再演示下获取环境变量的值。

修改CMakeLists.txt源代码文件,内容如下:

cmake_minimum_required(VERSION 3.10)

project("variable")

message("-------------------------------------------------")
message("PATH:       $ENV{PATH}")
message("-------------------------------------------------")

构建运行看下:

cmake ..

输出内容:

...
-------------------------------------------------
PATH:       /home/lirizhong/.cargo/bin:/usr/local/nosqlbooster:/usr/local/pycharm/bin:/usr/local/clion/bin:/usr/local/datagrid/bin:/usr/local/idea/bin:/usr/local/goland/bin:/usr/local/go/bin:/usr/local/protoc/bin:/usr/local/maven/bin:/usr/local/java/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
-------------------------------------------------
  ...


2.7.4、列表

格式:

set(srcs a.c b.c c.c) # sets "srcs" to "a.c;b.c;c.c"
set(x a "b;c") # sets "x" to "a;b;c", not "a;b\;c"

后续会提到如何便利列表。

好了,累了,孩子也哭了,不写了。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表