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" )
设置变量
#直接设置
set(LIB_SRC src/mymath.cpp src/myadd.cpp ...)
#在原值后面增加
set(LIB_SRC "${LIB_SRC}" src/mymath.cpp src/myadd.cpp ...)
编译选项
#C,C++都启用的编译选项
add_compile_options(-Wall -Wextra -pedantic -Werror)
add_compile_options(-g)
#设置C编译选项
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Os -g)
#设置C++编译选项
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" -std=c++11 -Wall -Os -g)
条件生成
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"
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。