开发工具:
文件大小: 270kb
下载次数: 0
上传时间: 2019-07-28
详细说明:Cmake实践.pdf,Cmake实践.pdfCmake实践.pdf,欢迎大家下载。初识 cmake
Cmake不再使你在构建项目时郁闷地想自杀了
位KDE开发者
1,背景知识:
cmake是 kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍
生品,最终形成体系,成为一个独立的开放源代码项目。项目的诞生时间是2601年。其官
方网站是Www, cmake.org,可以通过访问官方网站获得更多关于 cmake的信息。 cmake
的流行其实要归功于KDE4的开发(似乎跟当年的5vn一样,KDE将代码仓库从CVS迁移到
SVN,同时证明了SWN管理大型项目的可用性),在KDE开发者使用了近10年 autotools
之后,他们终于决定为KDE4选择一个新的工程构建工具,其根本原因用KDE开发者的话来
说就是:只有少数几个“编译专家"能够掌握KDE现在的构建体系
( admin/ Makefile. common),在经历了 unsermake, Scons以及 cmake的选型和
试之后,KDE4决定使用 cmake作为自己的构建系统。在迁移过程中,进展异常的顺利,并
获得了 cmake开发者的支持。所以,目前的KDE4开发版本已经完全使用 cmake来进行构
建。像 kdesvn, rosegarden等项目也开始使用 cmake,这也注定了 cmake必然会成为
个主流的构建体系。
2,特点:
cmake的特点主要有:
,开放源代码,使用类BSD许可发布ohttp://cmake.org/html/copyrigHt.html
2,跨平台,并可生成 native编译配置文件,在 Linux/Unix平台,生成 makefile,在
苹果平台,可以生成ⅹcode,在 Windows平台,可以生成MsVC的工程文件。
3,能够管理大型项目,KDE4就是最好的证明。
4,简化编译构建过程和编译过程。 Cmake的工具链非常简单: cmake+make。
5,高效虑,按照KDE官方说法, CMake构建KDE4的 kdelib5要比使用 autotools来
构建KDE3.5.6的 delibes快4%,主要是因为 Cmake在工具链中没有 Libtool。
6,可扩展,可以为 cmake编写特定功能的模块,扩充 cmake功能。
3,问题,难道就没有问题?
, cmake很简单,但绝对没有听起来或者想象中那么简单。
2, cmake编写的过程实际上是编程的过程,跟以前使用 autotools一样,不过你需要编
写的是 CMakelist5.txt(每个目录一个),使用的是〃 cmake语言和语法”。
3, cmake跟已有体系的配合并不是特别理想,比如 pkgconfig,您在实际使用中会有所
体会,虽然有一些扩展可以使用,但并不理想
4,个人的建议
如果你没有实际的项目需求,那么看到这里就可以停下来了,因为 cmake的学习过程就
是实践过程,没有实践,读的再多几天后也会忘记。
2,如果你的工程只有几个文件,直接编写 Makefile是最好的选择。
3,如果使用的是C/C+/Java之外的语言,请不要使用 cmake(至少目前是这样)
4,如果你使用的语言有非常完备的构建体系,比如java的ant,也不需要学习 cmake
虽然有成功的例子,比如QT4.3的 csharp绑定 goto
5,如果项目已经采用了非常完备的工程管理工具,并且不存在维护问题,没有必要迁移到
cmake
4,如果仅仅使用qt编程,没有必要使用 cmake,因为 qmake管理Qt工程的专业性和自
动化程度比 cmake要高很多。
二,安装 cmake
还需要安装吗?
cmake目前已经成为各大 Linux发行版提供的组件,比如 Everest直接在系统中包含
Fedora在 extra仓库中提供,所以,需要自己动手安装的可能性很小。如果你使用的操
作系统(比如 Windows或者某些 Linux版本)没有提供 cmake或者包含的版本较旧,建议
你直接从 cmake官方网站下载安装。
http://www.cmake.org/html/downloAd.html
在这个页面,提供了源代码的下载以及针对各种不同操作系统的二进制下载,可以选择适合
自己操作系统的版本下载安装。因为各个系统的安装方式和包管理格式有所不同,在此就不
再赘述了,相信一定能够顺利安装 cmake。
,初试 cmake- cmake的 helloworld
Hel0 world,世界你好
本节选择了一个最简单的例子 Helloworld来演练一下 cmake的完整构建过程,本节并不
会深入的探讨 cmake,仅仅展示一个简单的例子,并加以粗略的解释。我们选择了
Everest linux作为基本开发平台,因为这个只有一张CD的发行版本,包含了gcc
4.2/gtk/qt3/qt4等完整的开发环境,同时,系统默认集成了 cmake最新版本2.4.6。
1,准备工作
首先,在/ backup目录建立一个 cmake目录,用来放置我们学习过程中的所有练习。
mkdir -p/backup/cmake
以后我们所有的 cmake练习都会放在/ backup/ cmake的子目录下(你也可以自行安排目录,
这个并不是限制,仅仅是为了叙述的方便)
然后在 cmake建立第一个练习目录t1
d/backup/ cmake
mkdir tl
cd tl
在t1目录建立main.C和 CMakelists.txt(注意文件名大小写):
main.C文件内容
//main. c
#include
int maino
printf( hello world from tl Main!\n")
return 0:
Cmakelists.txt文件内容:
PROJECT (HELLO)
SET(SRC LIST main. c)
MESSAGE(STATUS This is binary dir $CHELLO BINARY DIRj
MESSAGE(STATUS This is source dir SHELLO SOURCE DIR])
ADd EXECUTABLE(helLo SRC LISt)
2,开始构建
所有的文件创建完成后,t1目录中应该存在main.C和 CMakelists.txt两个文件
接下来我们来构建这个工程,在这个目录运行
cmake.(注意命令后面的点号,代表本目录)。
输出大概是这个样子:
Check for working C compiler: /usr/bin/gcc
Check for working c compiler: /usr/bin/gcc -. works
Check size of void
Check size of void- done
Check for working CXX compiler: /usr/bin/C++
Check for working CXx compiler: /usr/bin/C++-- works
This is binary dir /backup/cmake/t1
This is source dir /backup/cmake/tl
Configuring done
Generating done
Build files have been written to: /backup/ cmake/tl
再让我们看一下目录中的内容
你会发现,系统自动生成了:
CMakefiles, CMakeCache.txt, cmake install. cmake等文件,并且生成了
Makefile
现在不需要理会这些文件的作用,以后你也可以不去理会。最关键的是,它自动生成了
Makefile
然后进行工程的实际构建,在这个目录输入make命令,大概会得到如下的彩色输出:
Scanning dependencies of target hello
[100%] Building c object CMakeFiles/hello.dir/main.O
Linking c executable hello
[100%] Built target hello
如果你需要看到make构建的详细过程,可以使用 make verbi0SE=1或者VERB0SE=1
make命令来进行构建。
这时候,我们需要的目标文件heLo已经构建完成,位于当前目录,尝试运行一下:
Thello
得到输出:
Hello world from main
恭喜您,到这里为止您已经完全掌握了 cmake的使用方法。
3,简单的解释
我们来重新看一下 CMakelists.txt,这个文件是 cmake的构建定义文件,文件名
是大小写相关的,如果工程存在多个目录,需要确保每个要管理的目录都存在一个
CMakelists.txt。(关于多目录构建,后面我们会提到,这里不作过多解释)
上面例子中的 CMakelists.txt文件内容如下
PROJECT (HELLO)
SET( SRC LIST main.c)
MESSAGE(STATUS This is binary dir $HELLO BINARY DIRl)
MESSAGE(STATUS This is source dir SHELLO SOURCE DIR])
ADd EXECUTABLE(hello SRC listy)
PR0JECT指令的语法是
PROJECT(projectname [CXX] [c] [ Java]
你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,
默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake变量
< projectname> BINARY DIR以及< projectname>S0 URCE DIR,这里就是
HELL0 BINARY DIR和HELL0S0 URCE DIR(所以 CMakelists.txt中两个 MESSAGE
指令可以直接使用了这两个变量),因为采用的是内部编译,两个变量目前指的都是工程所
在路径/ backup/ cmake/t1,后面我们会讲到外部编译,两者所指代的内容会有所不同。
同时 cmake系统也帮助我们预定义了 PROJECT BINARY DIR和PR0 JECT SOURCE DIR
变量,他们的值分别跟HELL0 BINARY DIR与HELL0S0 URCE DIR一致。
为了统一起见,建议以后直接使用PR0 JECT BINARY DIR, PROJECT S0 URCE DIR,即
使修改了工程名称,也不会影响这两个变量。如果使用了
< projectname>S0 URCE DIR,修改工程名称后,需要同时修改这些变量。
SET指令的语法是:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
现阶段,你只需要了解SET指令可以用来显式的定义变量即可。
比如我们用到的是SET( SRC LIST main.C),如果有多个源文件,也可以定义成
SET(SRC LIST main. c tlc t2.c)o
MESSAGE指令的语法是
MESSAGE([SEND ERROR STATUS FATAL ERROR]"message to display
这个指令用于向终端输出用户定义的信息,包含了三种类型
SEND ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为的信息。
FATAL ERR0R,立即终止所有 cmake过程
我们在这里使用的是 STATUS信息输出,演示了由PR0JECT指令定义的两个隐式变量
HELL0 BINARY DIR和HELL0S0 URCE DIR。
ADd EXECUTABLE(hello ISRC LIST])
定义了这个工程会生成一个文件名为 hello的可执行文件,相关的源文件是SRCL工ST中
定义的源文件列表,本例中你也可以直接写成 ADD EXECUTABLE( hello main.c)
在本例我们使用了${}来引用变量,这是 cmake的变量应用方式,但是,有一些例外,比
如在工F控制语句,变量是直接使用变量名引用,而不需要${}。如果使用了$}去应用变
量,其实IF会去判断名为$所代表的值的变量,那当然是不存在的了。
将本例改写成一个最简化的 CMakelists.txt:
PROJECT(HELLO
ADD EXECUTABLE (hello main.c)
4,基本语法规则
前面提到过, cmake其实仍然要使用〃 cmake语言和语法〃去构建,上面的内容就是所谓的
" cmake语言和语法",最简单的语法规则是:
1,变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
2,指令(参数1参数2...)
参数使用括弧括起,参数之间使用空格或分号分开
以上面的 ADD EXECUTABLE指令为例,如果存在另外一个funC.C源文件,就要写成:
ADD EXECUTABLE( hello main. c func,c)或者
ADd EXECUTABLE hello main. c; func. c)
3,指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令
上面的 MESSAGE指令我们已经用到了这条规则:
MESSAGE(STATUS " This is binary dirstHELLo BINARY DIR])
也可以写成:
MESSAGE(STATUS " This is binary dir $iHELLO BINARY DIR]")
这里需要特别解释的是作为工程名的HELL0和生成的可执行文件 hello是没有任何关系的。
heLo定义了可执行文件的文件名,你完全可以写成:
ADD EXECUTABLE(tl main. c)
编译后会生成一个t1可执行文件。
5,关于语法的疑惑
cmake的语法还是比较灵活而且考虑到各种情况,比如
SET( SR LIST main.C)也可以写成SET( SRC LIST“main.C")
是没有区别的,但是假设一个源文件的文件名是funC.C(文件名中间包含了空格)。
这时候就必须使用双引号,如果写成了SET( SRC LIsT fu nc.C),就会出现错误,提示
你找不到fu文件和nc.c文件。这种情况,就必须写成:
SET(SRC LIST fu nc.c")
此外,你可以可以忽略掉s0urce列表中的源文件后缀,比如可以写成
ADD EXECUTABLE(t1main), cmake会自动的在本目录查找main.C或者main.Cpp
等,当然,最好不要偷这个懒,以免这个目录确实存在一个main.C一个main
同时参数也可以使用分号来进行分割。
下面的例子也是合法的
ADD EXECUTABLE(t1main,Ct1.c)可以写成 ADD EXECUTABLE(t1
main. c; tl.c)
我们只需要在编写 CMakelists.txt时注意形成统一的风格即可
6,清理工程
跟经典的 autotools系列工具一样,运行:
make clean
即可对构建结果进行清理。
7,问题?问题!
“我尝试运行了 make distclean,这个指令一般用来清理构建过程中产生的中问间文件的,
如果要发布代码,必然要清理掉所有的中间文件,但是为什么在 cmake工程中这个命令是
无效的?
是的, cmake并不支持 make distclean,关于这一点,官方是有明确解释的:
因为 CMakelists.txt可以执行脚本并通过脚本生成一些临时文件,但是却没有办法来跟
踪这些临时文件到底是哪些。因此,没有办法提供一个可靠的 make distclean方案。
Some build trees created with gnu autotools have a"make
distclean" target that cleans the build and also removes makefiles
and other parts of the generated build system. CMake does not
generate a make distclean" target because CMakeLists. txt files
can run scripts and arbitrary commands : CMake has no way of
tracking exactly which files are generated as part of running
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.