欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CMakeLists.txt语法

程序员文章站 2024-02-19 18:41:04
...

CMakeLists.txt语法

1.开头

cmake_minimum_required(VERSION 2.8)
project(my_pro)
  1. 对CMake版本的要求,如果CMake小于2.8将报错。
  2. 指定项目名称为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")
  1. -O0:不优化
  2. -Wall:显示所有警告
  3. -g:利用操作系统的原生格式(native format)生成调试信息
  4. -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}
)
  1. STATIC:生成静态链接库。
  2. SHARED:生成动态链接库。
  3. 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)
  1. 指定生成的链接库目录
  2. 指定生成的可执行程序目录

0.字符串操作

STRING(TOLOWER ${PROJECT_NAME} LIBRARY_NAME)
  1. 把${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}
)

1.2 库文件