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)
include(${CMAKE_SOURCE_DIR}/cmake/Utils.cmake)
# 这里以 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(SRCS
example01.cpp
example02.cpp
)
set(SRCS ${SRCS} example03.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
${OpenCV_INCLUDE_DIRS}
)
link_directories(
${CMAKE_CURRENT_SOURCE_DIR}/libs
)
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 (UNIX OR APPLE)
set(EXE_NAME “${SOURCE_NAME}.bin”)
elseif (WIN32)
set(EXE_NAME “demo”)
endif()
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(${EXE_NAME} ${SRCS})
** 方便模块化编译 **
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}
)
# 这里链接了自己和 pthread 系统库和 opencv 第三方库
target_link_libraries(${EXE_NAME} pthread ${OpenCV_LIBS})
CMAKE_BINARY_DIR
CMAKE_CURRENT_BINARY_DIR
每个使用 add_subdirectory() 添加的目录都会在构建树中创建一个二进制目录.
CMAKE_SOURCE_DIR
CMAKE_CURRENT_SOURCE_DIR
用来指定库文件和头文件安装路径, 通常用法
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}
)
mkdir build & cd build
cmake ..
cmake --build .
默认为 Debug 模式,指定模式的方法
cmake --build . --config Release