初步学习CMake的使用
转自:
这几天研究了一下CMake,因为感觉在之后的开发中,我们终有一天需要这个工具。
CMake
Cmake 不再使你在构建项目时郁闷地想自杀了. --一位KDE开发者。
1,背景知识:
cmake 是 kitware 公司以及一些开源开发者在开发几个工具套件(VTK)的过程中衍生品,最终形成体系,成为一个独立的开放源代码项目。项目的诞生时间是 2001 年。其官方网站是 www.cmake.org,可以通过访问官方网站获得更多关于 cmake 的信息。cmake的流行其实要归功于 KDE4 的开发(似乎跟当年的 svn 一样,KDE 将代码仓库从 CVS 迁移到SVN,同时证明了 SVN 管理大型项目的可用性),在 KDE 开发者使用了近 10 年 autotools之后,他们终于决定为 KDE4 选择一个新的工程构建工具,其根本原因用 KDE 开发者的话来说就是:只有少数几个“编译专家”能够掌握 KDE 现在的构建体系(admin/Makefile.common),在经历了 unsermake, scons 以及cmake 的选型和尝试之后,KDE4 决定使用 cmake 作为自己的构建系统。在迁移过程中,进展异常的顺利,并获得了 cmake 开发者的支持。所以,目前的 KDE4 开发版本已经完全使用 cmake 来进行构建。像kdesvn,rosegarden 等项目也开始使用 cmake,这也注定了 cmake 必然会成为一个主流的构建体系。
2,特点
cmake的特点主要有:
1, 开放源代码(BSD许可证)。2, 跨平台。3, 能够管理大型项目。4, 简化编译构件过程和编译过程。5, 高效率。6, 可扩展。
3,安装cmake
在ubuntu下直接 sudo apt-get install cmake,我装的cmake的版本是2.4-patch 6, ubuntu版本7.04
4, 简单使用
建立一个临时目录 mkdir -p cmake/t1 && cd cmake/t1, 在这个文件夹下写一个最简单的程序main.c。
main.c 文件内容:
//main.c
#include < stdio .h >
int main()
{
printf("Hello World from t1 Main!\n");
return 0;
}
在它的同级目录下写一个文件,文件名是CMakeLists.txt(注意文件名大小写),CMakeLists.txt的内容是:
PROJECT (HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
CMakeLists.txt,脚本内容如下
#标识我们项目的名称
PROJECT(my_project)
#添加glib的include路径
INCLUDE_DIRECTORIES(/usr/include/glib)
#将common目录的所有文件名写到名为common_var的变量中去
AUX_SOURCE_DIRECTORY(common common_var)
# 将main.c main.h添加到PROJECT_FILE变量中
SET(PROJECT_FILE main.c main.h)
# 将common_var变量和PROJECT_FILE变量的内容放到ALL_FILE变量中去
SET(ALL_FILE ${PROJECT_FILE} ${common_var})
#根据ALL_FILE来生成可执行文件bt_server
add_executable (bt_server ${ALL_FILE})
#链接动态链接库libglib2.0.so和libpthread.so
target_link_libraries(bt_server libglib-2.0.so libpthread.so)
恩,编译脚本就这样写完了,简单吧。
下面的步骤更简单
在你的project下面建立一个目录,目录名叫build #随便你写什么名字都好,不过推荐用build,显得正规一些:)
进入终端,然后敲击命令 cmake.. #千万要记得后面的两个点。这表示CMakeLists.txt文件存放在上级目录下
如果cmake成功,你会看到build目录下生成一个makefile文件。此时在终端下敲击make.你的工程就会被编译成可执行文件.
4.1, 开始构件
在这个工程下运行cmake . (. 代表本目录)
然后就会生成这个文件的makefile.
之后运行 make,就可以生成hello程序了。