Reference - configuration of CMake
序言
在这篇文章中,我想分布介绍 CMakeLists.txt 中的的各个组件。在实际应用中只需将组件结合即可实现编译需求。
Basic Configuration
-
设置cmake最低版本如 3.10
cmake_minimum_required(VERSION <X.X>)
-
项目名称
project(<project_name>)
-
设置C++版本
set(CMAKE_CXX_STANDARD 14)
-
查找并添加第三方依赖
find_package(<package_name> REQUIRED
include_directories(<dir_path>)
Example:
find_package( OpenCV REQUIRED ) include_directories( ${OpenCV_INCLUDE_DIRS} <other_directory> ...)
Library
-
添加动态库和静态库
add_library(<library_name> STATIC/SHARED <source_files>)
library_name 将作为一个 target 以供后续使用
Example:
LIST(APPEND LIB_FILES "lib/algo.h" "lib/algo.cpp") add_library(lib STATIC ${LIB_FILES})
以下部分放在
add_executable
之后 -
添加头文件
INCLUDE_DIRECTORIES(./include)
-
将头文件包含在库中/链接library的目录
target_include_directories(<target> PUBLIC/PRIVATE <include_path>)
example:
target_include_directories(${LIBRARY_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
区别:
INCLUDE_DIRECTORIES
指向了此CMakeList中的所有target
相比之下,target_include_directories
仅用于特定目标
因此如果Project的所有目标都指向同样的头文件组那么第一个就足够了
- 为target添加需要链接的共享库,target可以是可执行文件或自定义的共享库
target_link_libraries(<target> <library_name> ...)
Executable
-
添加需要编译的源码,生成可执行文件
file_name
。通常,file_name
与project_name
一致file_name 也将作为一个 target 以供后续使用
add_executable(${PROJECT_NAME} <main>.cpp <file1>.cpp <file2>.cpp <file1>.hpp ... )
- 处理源文件数量很多的情况
aux_source_directory(dir var)
- dir: 源文件目录,用 . 表示当前目录
- var: 将目录内的文件存入一个变量中,以供接下来使用
aux_source_directory(. SOURCES) add_executable(${PROJECT_NAME} ${SOURCES})
-
处理有多个子目录的情况
在项目的最外层CMakeList.txt中加入
add_subdirectory(subdir)
子目录的CMakeList.txt中没有project()
Example:
-
进一步的,如果不想将所有源文件添加,则可以使用
set
将文件包起来
set(<var> <value1> <value2>)
用于定义变量,后续可以使用${var}
来索引变量set( SOURCES ./main.c ./testFunc1.c ./testFunc.c)
-
Alternative: 用list存储文件名,再执行
add_executable
LIST(APPEND HEADER_FILES "util.h" "constants.h") LIST(APPEND SOURCE_FILES "main.cpp") add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${HEADER_FILES})
make install
see links