CMakeLists.txt语法
程序员文章站
2024-02-19 18:41:04
...
CMakeLists.txt语法
CMakeLists.txt语法
1.开头
cmake_minimum_required(VERSION 2.8)
project(my_pro)
- 对CMake版本的要求,如果CMake小于2.8将报错。
- 指定项目名称为my_pro,可以用 ${PROJECT_NAME} 引用。
2.指定次级CMakeLists.txt位置
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/CMakeModules/")
LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)
ADD_SUBDIRECTORY(${LIBRARY_NAME})
ADD_SUBDIRECTORY(examples)
3.编译选项
add_definitions("-DXXX")
4.编译模式
set(CMAKE_BUILD_TYPE "Debug")
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE Release)
ENDIF()
5.C++11支持
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_compile_options(-std=c++11)
if(CONAN_LIBCXX STREQUAL "libstdc++11")
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=1)
elseif(CONAN_LIBCXX STREQUAL "libstdc++")
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
endif()
上面给出了3种方式,使用其中一种即可。
6.调试信息
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
- -O0:不优化
- -Wall:显示所有警告
- -g:利用操作系统的原生格式(native format)生成调试信息
- -ggdb:使GCC为GDB生成专用的更为丰富的调试信息
0.编译
1.1 编译生成链接库。
add_library(${PROJECT_NAME} #STATIC | SHARED | MODULE
${source_files}
src/lib/lib.cc
)
target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
)
- STATIC:生成静态链接库。
- SHARED:生成动态链接库。
- MODULE:生成的库可以被可执行文件动态加载。
1.2 编译生成可执行文件
add_executable(run main.cc)
target_link_libraries(run
${OpenCV_LIBS}
)
add_dependencies(run ${${PROJECT_NAME}_EXPORTED_TARGETS})
0.指定输出目录
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/build/libs)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/build/bin)
- 指定生成的链接库目录
- 指定生成的可执行程序目录
0.字符串操作
STRING(TOLOWER ${PROJECT_NAME} LIBRARY_NAME)
- 把${PROJECT_NAME}变量值的全小写赋值给变量LIBRARY_NAME
0.变量
${CMAKE_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
[参考]
0.指定路径
1.2 头文件
include_directories(
${PROJECT_SOURCE_DIR}/include
)
1.2 第三方库
link_directories(
${PROJECT_SOURCE_DIR}/libs
)
相当于LD_LIBRARY_PATH的作用。
0.常用库的引用
1.1 opencv
set(OpenCV_DIR /home/XXX/software/OpenCV340/share/OpenCV)
#set(CMAKE_PREFIX_PATH /home/master/local_install/)
find_package(OpenCV 3.1.0 EXACT REQUIRED)
#find_package(OpenCV REQUIRED)
MESSAGE(STATUS "opencv version: ${OpenCV_VERSION}")
include_directories(
${OpenCV_DIRS}
${OpenCV_INCLUDE_DIRS}
)
target_link_libraries(exe
${OpenCV_LIBS}
)