1. 最基本的CMakeLists 文件
# 它将 main.c 编译为 hello 的可执行文件
PROJECT (HELLO) # 项目名称
SET(SRC_LIST main.c) # 源文件
ADD_EXECUTABLE(hello ${SRC_LIST}) # 可执行文件
Cmake 是强烈推荐外部编译的,内部编译会生成一些无法自动删除的中间文件。使用 cmake [CMakeLists.txt path] 进行编译,会生成Makefile等文件,在此执行 make, 即可生成可执行文件。
2. 添加子文件
可以使用ADD_SUBDIRECROTY(source_dir [binary_dir][EXCLUDE_FROM_ALL])来添加下一层的 CMakeLists.txt, 并指定目录.
ADD_SUBDIRECTORY(src bin) # 将 src目录编译为 bin 目录
另外可以都可以通过 SET 指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量来指定最终的目标二进制的位置(指最终生成的 hello 或者最终的共享库,不包含编译生成的中间文件)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
3. 使用目标文件的安装:
目标文件的安装
INSTALL(TARGETS myrun mylib mystaticlib RUNTIME DESTINATION bin # 可执行二进制库 LIBRARY DESTINATION lib # 动态库 ARCHIVE DESTINATION libstatic # 静态库 )
普通文件的安装
INSTALL(FILES README DESTINATION share)
目录的安装
INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj) # icons 文件夹 scripts 目录下的所有文件
如果你要直接安装到系统,可以使用如下指令:
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
4. 添加库
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
# SHARED,动态库
# STATIC,静态库
# MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待
# 更新库版本号
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
# VERSION 指代动态库版本,SOVERSION 指代 API 版本
5. 使用外部共享库和头文件
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) # 添加头文件包含路径
TARGET_LINK_LIBRARIES(target library1 library2...) # 为 target 添加共享库
6. 其它
设置最小的CMake 版本
cmake_minimum_required(VERSION 3.1.0)
限定使用 C++11
# Use C++11 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) message(STATUS "C++11 support has been enabled by default.")
常见的变量
CMAKE_CURRENT_SOURCE_DIR # 当前 CMakeLists 所在路径