文章目录
- 通过实例学习 CMakeLists.txt 的编写
- 指定要求的最低 CMake 版本
- 指定工程名
- 设置编译选项
- 设置编译模式
- 引用子 cmake 文件,一般用于定义自己的 cmake 命令和查找依赖库
- find_package 用于查找依赖的第三方库
- 定义编译控制变量
- set 用于自定义变量
- set 以追加的方式添加定义
- list 用于追加或者删除变量的值
- include_directories 指定头文件查找目录
- link_directories 指定链接库搜索目录
- find_library 查找指定的库文件
- 用 if .. else .. 进行不同平台的配置
- message 打印信息
- 文件操作
- add_executable 用于生成可执行文件
- 指定头文件链接规则,与 include_directories 相比,cmake 官方推荐使用 target_include_directories
- target_link_libraries 用于指定链接库
- cmake 常用变量
- cmake 常用参数
- Windows 下 cmake 的使用
通过实例学习 CMakeLists.txt 的编写
指定要求的最低 CMake 版本
cmake_minimum_required(VERSION 3.12)
指定工程名
project(demo)
设置编译选项
# CMAKE_C_FLAGS 为 gcc 编译器选项
# CMAKE_CXX_FLAGS 为 g++ 编译器选项
set(CMAKE_C_FLAGS " ${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS “-std=c++11 ${CMAKE_CXX_FLAGS}”)
设置编译模式
SET(CMAKE_CXX_FLAGS_DEBUG “$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb”)
SET(CMAKE_CXX_FLAGS_RELEASE “$ENV{CXXFLAGS} -O3 -Wall”)
# 设置 Debug 模式可以进行调试
# CMAKE_BUILD_TYPE 为 cmake 编译模式变量
set(CMAKE_BUILD_TYPE Debug)
# 设置 Release 模式
set(CMAKE_BUILD_TYPE Release)
引用子 cmake 文件,一般用于定义自己的 cmake 命令和查找依赖库
include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake)
find_package 用于查找依赖的第三方库
# 这里以 opencv 为例
if (UNIX)
set(OpenCV_DIR “/usr/local/include/opencv3.2.0/share/OpenCV”)
endif()
find_package( OpenCV REQUIRED )
定义编译控制变量
if (OpenCV_FOUND)
message(STATUS “Found OpenCV: ${OpenCV_VERSION}”)
add_definitions(-DOPENCV)
endif()
定义了一个 OPENCV 的控制变量
其中一个用法是可以在代码中控制找到了 opencv 和没有找到 opencv 两种情况的处理
ifdef OPNECV
/* code */
endif
add_definitions 更多用法可以查看 cmake 官方文档
set 用于自定义变量
# 这里是列举源文件名,方便后面使用
set(SRCS
example01.cpp
example02.cpp
)
set 以追加的方式添加定义
set(SRCS ${SRCS} example03.cpp)
list 用于追加或者删除变量的值
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
include_directories 指定头文件查找目录
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${OpenCV_INCLUDE_DIRS}
)
link_directories 指定链接库搜索目录
link_directories(
${CMAKE_CURRENT_SOURCE_DIR}/libs
)
find_library 查找指定的库文件
find_library(LIB_NAME opencv)
find_library 的查找路径可以由 link_directories 来指定。如果找到了库文件,将查找到的库文件路径存储在 LIB_NAME 里面,如果没有找到 LIB_NAME 的值为 LIB_NAME-NOTFOUND.
可以用 message(STATUS "find lib = " ${LIB_NAME}) 来验证
也可以直接在 find_library 中指定查找路径(路径可以指定多个):
find_library(LIB_NAME opencv ${CMAKE_CURRENT_SOURCE_DIR}/3rd/libs)
LIB_NAME 可以被 target_link_libraries 使用
target_link_libraries(${EXE_NAME} ${LIB_NAME})
用 if … else … 进行不同平台的配置
# 这里是根据不同平台指定可执行文件名字
if (UNIX OR APPLE)
set(EXE_NAME “${SOURCE_NAME}.bin”)
elseif (WIN32)
set(EXE_NAME “demo”)
endif()
message 打印信息
message("exe name: " ${EXE_NAME})
# FATAL_ERROR: CMake 错误,停止运行和生成
# SEND_ERROR: CMake 错误, 继续运行但不会生成结果
# WARNING: CMake 警告, 继续运行
# AUTHOR_WARNING: CMake 警告(dev), 继续运行 (ps: 没搞懂 dev 什么意思)
# DEPRECATION: 如果变量 CMAKE_ERROR_DEPRECATED 或者
# CMAKE_WARN_DEPRECATED 被启用的话则会报错误或者警告
# STATUS: 给用户看的主要的提示信息
# 还有几个放链接了太长了… message 文档
message(STATUS "message 打印消息: " ${EXE_NAME})
文件操作
使用 file(), 支持的很丰富,读、写、删除、下载、上传、拷贝等等
cmake 官方文档: https://cmake.org/cmake/help/v3.0/command/file.html
add_executable 用于生成可执行文件
add_executable(${EXE_NAME} ${SRCS})
指定头文件链接规则,与 include_directories 相比,cmake 官方推荐使用 target_include_directories
** 方便模块化编译 **
target_include_directories(${LIB_NAME}
PUBLIC
${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/3rd/arcsoft/include
${CMAKE_SOURCE_DIR}/3rd/libuv/include
${OpenCV_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
)
target_link_libraries 用于指定链接库
# 这里链接了自己和 pthread 系统库和 opencv 第三方库
target_link_libraries(${EXE_NAME} pthread ${OpenCV_LIBS})
cmake 常用变量
CMake 构建目录路径
CMAKE_BINARY_DIR
生成的二进制文件所在目录路径
CMAKE_CURRENT_BINARY_DIR
每个使用 add_subdirectory() 添加的目录都会在构建树中创建一个二进制目录.
顶层源码目录路径
CMAKE_SOURCE_DIR
CMake 正在处理的目录路径
CMAKE_CURRENT_SOURCE_DIR
cmake 常用参数
安装编译出的文件到指定目录
用来指定库文件和头文件安装路径, 通常用法
cmake -DCMAKE_INSTALL_PREFIX=/usr/local .
CMakeLists.txt 中指定
set_target_properties(${LIB_NAME} PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
)
set(INSTALL_PATH ${CMAKE_CURRENT_SOURCE_DIR}/install)
set(CMAKE_INSTALL_PREFIX ${INSTALL_PATH})
#install
install(TARGETS ${LIB_NAME}
CONFIGURATIONS RELEASE
LIBRARY DESTINATION ${INSTALL_PATH}/lib COMPONENT RUNTIME
)
set(HEADER_FILES
${CMAKE_CURRENT_SOURCE_DIR}/include/example.h
)
install(FILES
${HEADER_FILES}
DESTINATION
${INSTRALL_PATH}/include/${PROJECT_NAME}
)
cmake 指定使用 ninja
cmake -G Ninja ..
make/ninja install 时去除 debug 符号信息
make install/strip
ninja install/strip
Windows 下 cmake 的使用
命令行编译程序
mkdir build & cd build
cmake ..
cmake --build .
默认为 Debug 模式,指定模式的方法
cmake --build . --config Release