准备工作
- 将工程c源码放入子文件夹
src
中 - 将工程头文件放入子文件夹
include
中 - 将说明文档放入子文件夹
doc
中 - 在根目录创建
COPYRIGHT、README、sh启动脚本
常用关键命令
定义工程名称,定义好会预定义两个工程变量PROJECT_BINARY_DIR
,PROJECT_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})