cmake
cmake online document https://cmake.org/cmake/help/v2.8.8/cmake.html#section_Name
基本项目:
cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)
在项目中添加多个文件:
项目结构:
| -- CMakeLists.txt
| -- build
| -- include
| \ -- student.h
\ -- src
| -- student.cpp
\ -- tutorial.cpp
头文件放置在include文件夹中,源文件放置在src文件夹中,其对应的CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project(Tutorial)
include_directories(${PROJECT_SOURCE_DIR}/include)
set(
SOURCE
src/tutorial.cpp
src/student.cpp
)
add_executable(Tutorial ${SOURCE})
添加子目录
add_subdirectory()用来生成新的作用域,新的作用域中应当有CMakeLists.txt进行配置,例如:
cmake_minimum_required (VERSION 2.6)
project(Tutorial)
include_directories(${PROJECT_SOURCE_DIR}/include)
add_subdirectory(${PROJECT_SOURCE_DIR}/src) (添加新的作用域)
在/src目录下的CMakeLists.txt:
add_executable(tutorial tutorial.cpp student.cpp)
库
创建库
add_library(foo foo1.cpp foo2.cpp)
target_link_libraries(foo bar)
将库连接到可执行文件
add_executable(foobar foobar.cpp)
target_link_libraries(foobar foo)
链接到库
操作系统的系统库通常位于/usr/lib 或者/lib 目录,这些目录被链接器作为隐含的库搜索目录,但有时find_libraries可能找不到匹配的库文件,这时需要使用link_directories()指定目标库文件所在的位置。该项命令只对在它之后创建的命令有效。当然,该问题也可以用指定绝对路径来解决。
link_directories(/path/to)
add_executable(myexe myexe.c)
target_link_libraries(myexe A B)
add_executable(myexe myexe.c)
target_link_libraries(myexe /path/to/libA.so /path/to/libB.so)
查找包
例子:寻找CURL模块
直接使用指令添加
include_libraries(/usr/include)
target-link_libraries(curltest curl)
使用cmake提供的FIndCURL模块
FIND_PACKAGE(CURL)
find_package(<package> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [COMPONENT] )
该命令有两种模式,"module" mode 和 "config" mode。 find_package命令调用预定义在CMAKE_MODULE_PATH下的Find<name>.cmake模块。如果找到则进行加载,并调用该文件来寻找目标包的全部组件。如果没有找到并且MODULE 选项没有设置, 命令会自动进入config mode,寻找<Package>Config.cmake文件。
QUIET:disable message if package cannot be found
REQUIRED: stops processing with an error message if the package cannot be found
[version] request a version
EXACT requests that the version be matched exactly
COMPONENT list of required components my be listed after the COMPONENTS option
再找到包之后,一般会定义一系列变量供当前工程使用:
<PKG>_INCLUDE_DIR 包的头文件目录
<PKG>_LIBRARIES 包的库目录
<PKG>_DEFINITIONS 使用包时,编译代码需要的宏定义
<PKG>_FOUND 如果包被找到则定义为真
其他设置
设置可执行文件的输出路径
进入build文件夹进行编译的时候,所有可执行文件将会置于build文件夹中。为了便于管理,可以在根目录下新建bin文件夹,将所有可执行文件放于bin文件夹中
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
设置c++11标志位
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
设置c++11标准;
如果编译器不支持当前的c++标准,那么cmake会选择编译器支持的旧版本来编译程序。为了阻止这种情况的发生,我们设置CMAKE_CXX_STANDARD_REQUIRED 为ON。
最后一句设置是否启用编译器扩展。
其他常用指令
add_dependencies(target-name depend-target depend-target ...)
定义target依赖的其他target,确保在编译本target之前,其他的target已经被构建
list operations (查看文档)
list(APPEND <list> [<element> ...])
appends elements to the list
e.g. LIST( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules ) :将findg2o.cmake 添加到CMAKE_MODULE_PATH下
list(REMOVE_ITEM <list> <value> [<value> ...])
remove the given items from the list

浙公网安备 33010602011771号