《cmake常用语法参考》
利用cmake来构建C++工程是一个非常方便的选择,尤其是依赖的库比较多的时候,或者工程比较大的时候都非常方便,这里记录一些cmake常用的语法,
Key Words:cmake
Beijing, 2019
Code:
CMakeLists语法参考
文章目录
1. cmake常用语法
定义变量
SET(ENV x86)
MESSAGE(${ENV}) # 打印变量
# 定义宏参数
ADD_DEFINITIONS(-D_GLIBCXX_USE_CXX11_ABI=0)
# 指定编译结果存放路径
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../release)
条件控制语句
SET(ENV x86)
IF(ENV STREQUAL x86)
ELSE()
ENDIF()
指定引用库
#### 指定头文件路径
INCLUDE_DIRECTORIES()
#### 指定包含所需库文件的文件夹
LINK_DIRECTORIES()
#### 指定所需库文件
LINK_LIBRARIES()
引入OpenMP
FIND_PACKAGE(OpenMP)
if(OPENMP_FOUND)
message("********openmp found")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_C_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()
收集编译文件
#### 把src文件夹下的所以.cpp文件赋值给SRC变量
FILE(GLOB SRC "./src/*.cpp")
编译语法
#### 编译可执行文件
ADD_EXECUTABLE(XXXExe ${SRC})
#### 编译动态库文件|静态库文件
ADD_LIBRARY(XXXLIB SHARED ${SRC})
ADD_LIBRARY(XXXLIB STATIC ${SRC})
#### 给编译的文件连接其依赖的库文件
TARGET_LINK_LIBRARIES(XXXExe ${LIBS})
install 语法
#### make install命令 移动动态库和静态库文件
INSTALL(TARGETS lib lib_static
LIBRARY DESTINATION ${YYY}/lib
ARCHIVE DESTINATION ${YYY}/lib
)
#### make install命令 移动文件夹
INSTALL(DIRECTORY xxx/xxx DESTINATION YYY/YYY)
#### make install命令 移动文件
INSTALL(FILES xxx.h xxx.hpp DESTINATION YYY/YYY)
2. cmake 执行命令
# 查看cmake能否通过FIND_PACKAGE找到OpenMP
cmake --help-module-list|grep OpenMP
# 存放FindXXX.cmake的默认路径
/usr/share/cmake-3.10/Modules
3. cmake INCLUDE
有时候会有很多重复的变量会在各个项目中使用,这种情况我们不必重复的定义这些变量,对我而言OPENCV几乎用在所有的C++工程中,所以我不需要对每个工程的Cmakelists都重复的定义OPENCV的头文件和库文件,这就需要借助cmake语法中的INCLUDE方法,有两种方式:
- 1、指定.cmake文件的绝对路径
- INCLUDE(abs_path/xxx.cmake)
- 2、指定CMAKE_MODULE_PATH后就可以对该文件夹下的.cmake文件通过文件名当作模块来引用了
- INCLUDE(xxx)