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

 

posted @ 2019-05-26 03:26  孙小鸟  阅读(1092)  评论(0)    收藏  举报