CMake基本使用

20次阅读

共计 2044 个字符,预计需要花费 6 分钟才能阅读完成。

cmake 是个很方便的构建系统。官方的文档写的很明白,就是有点长。于是,根据自己的使用情况,挑选其中最重要的,简要说明于下:

CMakeLists.txt 的编写

CMakeLists.txt 的命令不区分大小写。

基本结构

# 最低版本声明,如果本机的 cmake 版本小于这个,会告警
cmake_minimum_required(VERSION 3.10)

# set the project name
project(Tutorial)

# add the executable
add_executable(Tutorial tutorial.cxx)
# 生成库
# add_library(MyMath STATIC mymath.cpp)

注:add_executable 和 add_library 可以源码列表,源码文件可以在后面通过 target_sources 添加。因为 target_xxx_xxx 的命令要求 target 先定义好,所以这一功能挺重要。

子目录

添加子目录前,需要先为子目录编写 CMakeLists.txt。

add_subdirectory(MathFunctions)

依赖库

  • 指定路径
link_directories(Tutorial  "${PROJECT_SOURCE_DIR}/lib" )

注:link_directories 只对在它后面声明的 target 有效。

  • 指定库

target_link_libraries 支持多种格式,以 libopus.a 为例

target_link_libraries(Tutorial opus)
target_link_libraries(Tutorial -lopus)
target_link_libraries(Tutorial libopus.a)
# 全路径
target_link_libraries(Tutorial ${PROJECT_SOURCE_DIR}/lib/libopus.a)

如果不是全路径模式,需要先指定路径。
注:target_link_libraries 加入的顺序非常重要。比如 Tutorial 依赖 libA.a, libA.a 依赖 libB.a。那么 libA.a 需要放在 libB.a 之前,不然会报错,说 libB.a 的符号找不到。据说是有一个选项,会尽量去掉没使用的符号。如果先写 libB.a,则链接 libB.a 时发现没有人在使用它,就把它去掉了。不过是啥选项没研究,默认行为,还是注意下顺序吧。

宏定义

target_compile_definitions(foo PUBLIC FOO)
target_compile_definitions(foo PUBLIC -DFOO)  # -D removed
target_compile_definitions(foo PUBLIC ""FOO) #"" ignored
target_compile_definitions(foo PUBLIC -D FOO) # -D becomes "", then ignored

#定义带值的
target_compile_definitions(Tutorial PRIVATE "LOG_LEVEL=2")

编译选项

add_compile_options(-Wall -Wextra -pedantic -Werror)
add_compile_options(-std=c++11 -g)

设置变量

set(LIB_SRC src/mymath.cpp src/myadd.cpp ...)

条件生成

if(WIN32)
    xxx
elseif(ANDROID)
    xxx
elseif(IOS)
    xxx
endif

target 的生成地址

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}) 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}) 

增加 install

# 安装 target(lib/app)
install(TARGETS Tutorial DESTINATION bin)
#安装头文件
install(FILES ${PROJECT_BINARY_DIR}/config.h DESTINATION include )

有了这个以后,就可以用 make install 安装了

打印信息

写了 CMakeLists.txt,却不能正常工作的时候,你一定想打印一些信息,看看到底是哪儿错了。于是 message 命令就派上了用场:

message("Build lib OK !")
message("use_mymath:${USE_MYMATH}")

CMake 命令

默认情况

cmake 源码目录
make

传递参数

- D 表示设置变量
- U 表示取消变量

cmake -DCMAKE_INSTALL_PREFIX=/opt/the/prefix 
-UMyPackage_DIR

生成 Xcode 或者 VS 项目

#xcode 项目
cmake ./src -GXcode
#VS 项目
cmake ./src -G"Visual Studio 12 2013" 

正文完
 0