cmake学习笔记

CMake是干嘛的,我不详说。我只知道,我写一个程序要将多个文件组织起来并编译。从头写一个MakeFile太麻烦。CMake配置文件比MakeFile要简单很多。
从原理上讲,CMake只是在帮助我们自动生成MakeFile而己。我们编译程序还是要make一下的。

我写了一个简单的示例,内容我们不需要关心,只关心其文件结构就行了。如下:
.
|-- CMakeLists.txt
|-- main.cpp
`-- person
    |-- CMakeLists.txt
    |-- person.cpp
    `-- person.h

在./目录与 person/都添加了一个CMakeLists.txt文件。

如下./CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.0)

project(StudyCmake CXX)
message(STATUS "project source: " ${PROJECT_SOURCE_DIR})
message(STATUS "project binary: " ${PROJECT_BINARY_DIR})

add_subdirectory(person)
include_directories(person)

#set (main_src main.cpp)
aux_source_directory(. main_src)
message(STATUS "Source files : " ${main_src})

add_executable(StudyCmake ${main_src})
target_link_libraries(StudyCmake person)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
message(STATUS "executable output path: " ${EXECUTABLE_OUTPUT_PATH})

第1行:cmake_minimum_required(VERSION 3.0),这个最好有,表示版本信息。

第2行:project(StudyCmake CXX),注明工程名称与编译的语言。CXX表示C++,C表示C。还有别的语言可选。这行语句的执行,会生成两个变量:
    > PROJECT_SOURCE_DIR    工程源码路径
    > PROJECT_BINARY_DIR    生成的可执行文件路径

第3-4行:message(STATUS "project source" ${PROJECT_SOURCE_DIR},这是一条信息打印语句。当cmake执行到这一句,会向终端输出相应的信息。这种信息分几种,这里是STATUS表示是状态信息,除了这个还有:
    > SEND_ERROR    产生错误,生成过程被跳过
    > FATAL_ERROR    立即终止cmake

取变量的值是${变量名},如:${PROJECT_SOURCE_DIR}。
在CMakeLists.txt里,变量名是区分大小写的,但命令不分大小写。如message与MESSAGE是等价的。但STATUS不等价于status。

第5行:add_subdirectory(person),cmake执行到这句时,就会跳入./person目录,读取person目录下的CMakeLists.txt文件。./person/CMakeLists.txt文件稍候再讲解。

这里,跟随cmake的执行过程,打开./person/CMakeLists.txt:

aux_source_directory(. person_src)
message(STATUS "Print files : " ${person_src})
add_library(person ${person_src})

这个文件里的出现一个新的命令:add_library(person ${person_src}),添加了一静态库person,由${person_src}生成。而person_src变量就是./person/目录下所有的源文件。

好回到主目标下的CMakeLists.txt文件:

第6行:include_directories(person),将./person加入头文件搜索路径。这样以来,在main.cpp文件里include "person.h"就不需要写成#include "person/person.h"了。

第7行:set(main_src main.cpp),将main_src变量设置为"main.cpp"。上面这条命令前加了#,表示注释了。CMakeLists.txt里的注释与Shell里的注释类似。

第8行:aux_source_directory(. main_src),将.目录下所有的源文件名称赋给main_src。这句命令与set(main_src main.cpp)是等价了。只不过aux_source_directory命令是通过去查目录所得,而set得写明。

第10行:add_executable(StudyCmake ${main_src}),添加一个可执行文件输出。由${make_src}生成StudyCmake可执行程序。这语话并不是以cmake执行的时候就完成可执行文件的生成,而是说我们要生成这么一个可执行文件。

第11行:target_link_libraries(StudyCmake person),设置链接,将person与StudyCmake目标一起链接。person是静态库目标。

好!关于CMakeLists.txt的内容就讲完了。下面我们在cmake一下。
通常,我们不会在源码目录下直接执行cmake,而是在源码目录下建一个build目录。然后进入这个目录,再执行cmake ..

$ mkdir build
$ cd build/
$ cmake ..
-- The CXX compiler identification is GNU 4.4.7
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- project source: /home/hevake_lcj/Workspace/C++/StudyCMake
-- project binary: /home/hevake_lcj/Workspace/C++/StudyCMake/build
-- Print files : ./person.cpp
-- Source files : ./main.cpp
-- executable output path: /home/hevake_lcj/Workspace/C++/StudyCMake/build/bin
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hevake_lcj/Workspace/C++/StudyCMake/build

cmake在执行过程中,不是立限就生成什么文件,而是通过解释上面的CMakeLists.txt文件里的命令来读取我们的意图。解释完之后,cmake才真正知道我们想到它做什么。最后才根据我们的意图生成对应的MakeFile与相关的目录层次。

cmake执行完之后,在build目录下就会生成很多文件,其中最主要的是生成了MakeFile。

前面我也说了cmake只不过是帮助我们生成MakeFile而己,真正的编译还得make一下才行。那就make一下好了。

$ make
Scanning dependencies of target person
[ 50%] Building CXX object person/CMakeFiles/person.dir/person.cpp.o
Linking CXX static library libperson.a
[ 50%] Built target person
Scanning dependencies of target StudyCmake
[100%] Building CXX object CMakeFiles/StudyCmake.dir/main.cpp.o
Linking CXX executable bin/StudyCmake
[100%] Built target StudyCmake

好了,我就先学到这里,相信日常的实用还是够用了。不够用的时候再学。

更多技能请参考:http://my.oschina.net/chen0dgax/blog/151894

时间: 2024-11-02 14:02:47

cmake学习笔记的相关文章

cmake 学习笔记(三)

转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我们需要知道: 去哪儿找头文件 .h 对比GCC的 -I 参数 去哪儿找库文件 (.so/.dll/.lib/.dylib/...) 对比GCC的 -L 参数 需要链接的库文件的名字

cmake学习笔记(五)

在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使用CMakeLists文件,接下来继续学习find_package的 config 模式及package configure文件相关知识 find_package 的 config 模式 当CMakeLists.txt中使用find_package命令时,首先启用的是 module 模式: 按照 C

cmake 学习笔记(二)

在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) 字符串列表 A;B;C # 分号分割或空格分隔的值 变量(字符串或字符串列表) set(Foo a b c) 设置变量 Foo command(${Foo}) 等价于 command(a b c) command("${Foo}") 等价于 command("a b c"

cmake 学习笔记(六)

希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMakeLists.txt 添加命令: enable_testing() 该命令需要在源码的根目录文件内. 从这一刻起,就可以在工程中添加add_test命令了 add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]] [WORKING_DIR

cmake 学习笔记(四)

接前面的一二三,学习一下 CMakeCache.txt 相关的东西. CMakeCache.txt 可以将其想象成一个配置文件(在Unix环境下,我们可以认为它等价于传递给configure的参数). CMakeLists.txt 中通过 set(... CACHE ...) 设置的变量 CMakeLists.txt 中的 option() 提供的选项 CMakeLists.txt 中find_package() 等find命令引入变量 命令行 cmake . -D <var>:<typ

cmake 学习笔记(一)

最大的Qt4程序群(KDE4)采用cmake作为构建系统 Qt4的python绑定(pyside)采用了cmake作为构建系统 开源的图像处理库 opencv 采用cmake 作为构建系统 ... 看来不学习一下cmake是不行了,一点一点来吧,找个最简单的C程序,慢慢复杂化,试试看: 例子一 单个源文件 main.c 例子二 ==>分解成多个 main.c hello.h hello.c 例子三 ==>先生成一个静态库,链接该库 例子四 ==>将源文件放置到不同的目录 例子五 ==&g

JetSpeed学习笔记(一)

笔记 JetSpeed学习笔记(一) fuweilin 2005-4-7 前言 参加了公司的portal的兴趣小组,今天对portal进行学习.首先上网看了看一些portal的资料,对portal.portlet.portlet container以及JSR168等概念有个基本的了解.决定进一步实战的方式感受portal,于是学习JetSpeed.     1.  JetSpeed介绍JetSpeed是Apache组织开发的一个采用Java和XML的开放源代码的企业信息门户的实现.门户可以让终端

PHP输入输出流学习笔记

  这篇文章主要介绍了PHP输入输出流学习笔记,PHP输入和输出流是通过php://来访问的,它允许访问 PHP 的输入输出流.标准输入输出和错误描述符,内存中.磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器,需要的朋友可以参考下 PHP输入和输出流是通过php://来访问的,它允许访问 PHP 的输入输出流.标准输入输出和错误描述符, 内存中.磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器. php://stdin, php://stdout 和 php://std

PHP学习笔记 (1) 环境配置与代码调试

一配置PHP环境 1.了解什么是PHP PHP("PHP: Hypertext Preprocessor",超文本预处理器的字母缩写) PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写.PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用 2.PHP的背景和优势 PHP的发展背景 1).1994年由Rasmus Lerdorf创建,开始是一个简单的Perl语言编写的程序,用统计