cmake 使用和 CMakeLists.txt 编写笔记

通过实例学习 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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值