CMake范例

## 基础 ### 设置cmake变量
SET(VARIABLE VALUE)

查看cmake变量

MESSAGE("CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")

查看系统环境变量

MESSAGE("$ENV{PATH}")

检查是否是win32系统

IF(WIN32) ...**do** something... ELSE(WIN32) ...**do** something **else**... ENDIF(WIN32)

检查是否是Linux系统

IF(CMAKE_SYSTEM_NAME STREQUAL Linux)

检查环境变量是否设置

IF(DEFINED ENV{FOO_HOME}) message("...using Foo found in $ENV{FOO_HOME}") ELSE() message("FOO_HOME is not defined. You must tell CMake where to find Foo") # exit early **return**() ENDIF()

</span>

检查表中是否包含某值

list(FIND VTK_MODULES_ENABLED "vtkFiltersParallel" HasMyModule)
IF(HasMyModule EQUAL -1)
message(FATAL_ERROR "You must build VTK with more modules.")
ENDIF()
## 输出 ### 消息
MESSAGE("Hello world")

变量

message("VTK Using Boost? ${VTK_USE_BOOST}")

出错信息

MESSAGE(FATAL_ERROR "An error occured.")
## IF条件语句
**if** (!VTK_USE_BOOST) MESSAGE(SEND_ERROR "VTK must be built with VTK_USE_BOOST=ON.") **endif** ()

逻辑运算符</span>

AND

`**if**(A AND B)`

OR

`**if**(A OR B)`

NOT

`**if**(NOT A)`

Compound

`**if**(NOT(A AND B))`
## 查找软件包 大型软件包都包含.cmake文件,可以直接使用类似:
FIND_PACKAGE(Eigen3)

指定查找.cmake文件位置

`set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/" ${CMAKE_MODULE_PATH})`

检查是否找到软件包

FIND_PACKAGE(Eigen3) **if**(EIGEN3_FOUND) ... **do** something ... **endif**(EIGEN3_FOUND)

抑制警告

FIND_PACKAGE(Eigen3 QUIET)

取消版本警告</span>

cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)

查找目录中的CMakeList.txt</span>

INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})

或者

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
## 设置链接目录 如果你包含的链接库没有.cmake文件,可以使用如下方式包含:
find_library(OPENSSL_LIB ssl $ENV{OPENSSL_LIB_PATH})

如果环境变量包含了OPENSSL_LIB_PATH,直接使用

target_link_libraries(mytarget ${OPENSSL_LIB})

如果没有设置环境变量,通过cmake gui设置。

设置包含目录</span>

`INCLUDE_DIRECTORIES(/some/directory)`
## 查看设置目录
get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES) message("inc_dirs = ${inc_dirs}")

自动化配置和生成</span>

`cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/mylocation ../`

编译器设置</span>

设置标识

ccmake ../../src/boost -DCMAKE_IS_EXPERIMENTAL=YES_I_KNOW

设置预处理标识

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__WXGTK__")

强制使用g++

`set(MySources main.c anotherFile.c)add_executable(SpinRecognize ${MySource})set_source_files_properties(${MySources} PROPERTIES LANGUAGE CXX)`

设置目标

set_target_properties( myexe_target PROPERTIES COMPILE_FLAGS "-Wall")

设置默认生成类型</span>

SET(CMAKE_BUILD_TYPE Debug CACHE STRING "default to debug" FORCE)

自定义类型</span>

String

SET(BUILD_PARAVIEW_PLUGIN ON CACHE STRING "Build Paraview plugin?" FORCE)

Bool

SET(DAI_WITH_BP ON CACHE BOOL "Belief Propagation" FORCE)

Comparison

**if**(DAI_WITH_BP EQUALS ON)
#**do** something
endif(DAI_WITH_BP EQUALS ON)

或者

**if**(DAI_WITH_BP)
#**do** something
endif(DAI_WITH_BP)

链接到特定库

ITK

ITK目录为:

export ITK_DIR=/home/doriad/bin/ITK

CMakeLists.txt写为:

FIND_PACKAGE(ITK REQUIRED)
INCLUDE(${ITK_USE_FILE})
ADD_EXECUTABLE(CastImageFilter CastImageFilter.cxx)
TARGET_LINK_LIBRARIES(CastImageFilter
vtkHybrid
ITKIO ITKBasicFilters ITKCommon
)

VXL

环境变量:

export VXLBIN="/home/doriad/bin/vxl"

Then in the CMakeLists.txt use:

FIND_PACKAGE(VXL REQUIRED)
INCLUDE(${VXL_CMAKE_DIR}/UseVXL.cmake)

VTK

Add the path to your environment:

export VTK_DIR="/home/doriad/bin/VTK"

Then in the CMakeLists.txt use:

FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})

Boost

假设生成为 ./bjam —prefix=/home/doriad/bin install

需要先修改 .bashrc:

export BOOST_ROOT="/home/doriad/bin"

再写cmakelist.txt

SET(Boost_USE_MULTITHREAD ON) #set a flag
FIND_PACKAGE(Boost)
INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES} ${Boost_INCLUDE_DIRS})
LINK_DIRECTORIES(${LINK_DIRECTORIES} ${Boost_LIBRARY_DIRS})

OpenCV

Add to the environment:

export OpenCV_DIR=/home/doriad/bin/OpenCV

Then in the CMakeLists.txt use:

FIND_PACKAGE(OpenCV REQUIRED ) INCLUDE_DIRECTORIES( ${OPENCV_INCLUDE_DIR} ) ADD_EXECUTABLE(Scalar Scalar.cxx) TARGET_LINK_LIBRARIES(Scalar ${OpenCV_LIBS})

Get Help Using a Library

cmake --help-module FindBoost

Add new libraries to CMake

/usr/share/cmake/Modules/FindOpenGL.cmake|

Dependency Graph

ccmake ../src/Program/ --graphviz=test.graph
dotty test.graph

CTest

Run a specific test by number

e.g. Test 622

ctest -I 622,622

Run a range of tests

e.g. Test 622 to 625

ctest -I 622,625

Run a test by name

ctest -R "itkTransformPoint*"|

Show verbose output of a test

ctest -V -R "itkTransformPoint*"|

Create a Test

cmake_minimum_required(VERSION 2.6) project(simple)ENABLE_TESTING() add_executable(simple simple.cpp)add_test(SimpleTest simple)
ADD_EXECUTABLE(ColoredLines ColoredLines.cpp)TARGET_LINK_LIBRARIES(ColoredLines vtkHybrid)

Create a library

add_library(MatlabLibrary ./MatlabDll/LidarK.cpp)

Installing executables

Once your project is built, you can use the ‘install’ make target to copy the executables to the directory specified by CMAKE_INSTALL_PREFIX.

add_executable(test test.cxx)install(TARGETS test RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX})

If you get an error like:

error while loading shared libraries: I get
libwx_gtk2u_core-2.9.so.1: cannot open shared object file: No such file or directory

you should add:

SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

to your CMakeLists.txt file.

Utilities

Add non-compiled files to a project

This allows files that are not compiled to be added to a project (Qt Creator, for example) while keeping them logically separated from files that are compiled (in the normal add_executable command):

add_custom_target(
MyProjectSources SOURCES
MyProject.h
)

Recursively add subdirectories to INCLUDE_DIRECTORIES

MACRO(HEADER_DIRECTORIES return_list) FILE(GLOB_RECURSE new_list *.h) SET(dir_list "") FOREACH(file_path ${new_list}) GET_FILENAME_COMPONENT(dir_path ${file_path} PATH) SET(dir_list ${dir_list} ${dir_path}) ENDFOREACH() LIST(REMOVE_DUPLICATES dir_list) SET(${return_list} ${dir_list})ENDMACRO()
来源: <[http://www.vtk.org/Wiki/CMake/Examples](http://www.vtk.org/Wiki/CMake/Examples)>
坚持原创技术分享,您的支持将鼓励我继续创作!