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}”)
定义了一个 OPENCV 的控制变量
其中一个用法是可以在代码中控制找到了 opencv 和没有找到 opencv 两种情况的处理

ifdef OPNECV
/* code */
endif

add_definitions 更多用法可以查看 cmake 官方文档
add_definitions(-DOPENCV)
endif()

# 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
)

# 用 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})

# 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_INSTALL_PREFIX 用来指定库文件和头文件安装路径, 通常用法:

cmake -DCMAKE_INSTALL_PREFIX=/usr/local .

猜你喜欢

转载自blog.csdn.net/VOlsenBerg/article/details/107001150