用CMake搭建一个高质量的C/C++工程

准备工作

  • 将工程c源码放入子文件夹src
  • 将工程头文件放入子文件夹include
  • 将说明文档放入子文件夹doc
  • 在根目录创建COPYRIGHT、README、sh启动脚本

常用关键命令

定义工程名称,定义好会预定义两个工程变量PROJECT_BINARY_DIRPROJECT_SOURCE_DIR

PROJECT(projectname [CXX] [C])

显式定义变量

SET(VAR [VALUE])
SET(SRC_LIST main.c func1.c)     # eg.

终端输出,printf功能,其中SEND_ERROR表示出错信息,生成过程跳过,STATUS输出前缀为-的信息,FATAL_ERROR会终止程序

MESSAGE([SEND_ERROR |STATUS | FATAL_ERROR] "message to display" ...)

定义工程生成可执行文件

ADD_EXECUTABLE(hello ${SRC_LIST})

定义工程生成库文件

ADD_LIBRARY(libname [SHARED|STATIC|MODULE] ${SRC_LIST})

将src子目录加入工程

ADD_SUBDIRECTORY(source_dir [binary_dir])

定义工程头文件目录

INCLUDE_DIRECTORIES([AFTER|BEFORE][SYSTEM] ${INC_DIR})

链接动态库

链接动态库名称(gcc中的-l)

TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ...)

链接时路径ling-time path(gcc中的-L)

LINK_DIRECTORIES(${LIB_DIR})

运行时路径run-time path(gcc中的-rpath)

set(CMAKE_SKIP_BUILD_RPATH FALSE)    # 决定编译时是否添加rpath信息
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)    # 使编译安装使用同一rpath
set(CMAKE_INSTALL_RPATH $ORIGIN) # ORIGIN为当前目录,很有用的一个宏
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE) # 设为FALSE可以将编译和运行时的路径分开

查看链接库信息命令

  • ldd列出动态库依赖信息
  • readelf -d查看动态库的信息
  • file查看文件信息

常用环境变量

PROJECT_BINARY_DIR  # 工程生成目录(通常是当前目录)
PROJECT_SOURCE_DIR  # 工程根目录
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
CMAKE_INSTALL_PREFIX  # 配置安装路径,默认定义是/usr/local

OpenCV相关技巧

find_package(OpenCV REQUIRED)
target_link_libraries(target ${OpenCV_LIBS})