cmake
一款开源的项目工程构建工具
特点
- 开放源代码,使用类 BSD 许可发布。
- 跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在 苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
- 能够管理大型项目,KDE4 就是最好的证明。
- 简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
- 高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来 构建 KDE3.5.6 的 kdelibs 快 40%,主要是因为 Cmake 在工具链中没有 libtool。
- 可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。
安装cmake
首先下载源码包
http://www.cmake.org/cmake/resources/software.html
这里下载的是cmake-2.6.4.tar.gz
随便找个目录解压缩
tar -xzvf cmake-2.6.4. tar.gz
cd cmake-2.6.4
依次执行:
./bootstrap
make
make install
构建项目
hello world
- 创建一个工程目录
- 添加文件 main.c
- 工程目录下建立一个新的文件CMakeLists.txt
- 编译项目,创建build目录,每次编译前可以清空此目录;
$ ls
hello
$ cd hello/build/
$ ls
$ cmake ..//cmakelist.txt所在的目录
– The C compiler identification is GNU
– The CXX compiler identification is GNU
– Check for working C compiler: /usr/bin/gcc
– Check for working C compiler: /usr/bin/gcc — works
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– 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
– Configuring done
– Generating done
– Build files have been written to: /home/kermit/Project/cmake/hello/build
$ make//可执行程序编译完成
cmakelist.txt
命令不区分大小写;
#后面时注释
#cmake最低版本需求,不加入此行会受到警告信息
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(HELLO) #项目名称
#把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST
AUX_SOURCE_DIRECTORY(. SRC_LIST)
#生成应用程序 hello (在windows下会自动生成hello.exe)
ADD_EXECUTABLE(hello ${SRC_LIST})
main.c
#include
int main(void)
{
printf(”Hello,Worldn”);
return 0;
}
处理多目录
第一步,项目主目录中的 CMakeLists.txt
PROJECT(main) #项目名称
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) #最低版本要求
ADD_SUBDIRECTORY( src ) #添加子目录进工程
AUX_SOURCE_DIRECTORY(. DIR_SRCS) #将当前目录的源文件添加到链表中
ADD_EXECUTABLE(main ${DIR_SRCS}) #依赖这些源文件生成目标文件
TARGET_LINK_LIBRARIES( main Test) #需要依赖链接的目标库文件
第二步,子目录中的 CmakeLists.txt
在子目录 src 中创建 CmakeLists.txt。
AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS) #将当前目录下的所有源文件添加到链表中
ADD_LIBRARY ( Test ${DIR_TEST1_SRCS}) #依赖链表中的源文件,生成目标库文件
第三步,执行 cmake
此过程同单文件项目;
依赖其他库
第一步,程序库说明文件
在项目的根目录中创建目录 cmake/modules/ ,在 cmake/modules/ 下创建文件 Findlibdb_cxx.cmake
MESSAGE(STATUS "Using bundled Findlibdb.cmake...")
FIND_PATH(
LIBDB_CXX_INCLUDE_DIR
db_cxx.h
#在如下目录中 查找 db_cxx.h,并保存在LIBDB_CXX_INCLUDE_DIR
/usr/include/
/usr/local/include/
)
FIND_LIBRARY(
LIBDB_CXX_LIBRARIES NAMES db_cxx
在如下目录中查找db_cxx,并保存在LIBDB_CXX_LIBRARIES
PATHS /usr/lib/ /usr/local/lib/
)
FindlibNAME.cmake ,其中NAME 是函数库的名称。
MESSAGE 会将参的内容输出到终端
FIND_PATH 指明头文件查找的路径
FIND_LIBRARY 用于查找链接库并将结果保存在变量中
第二步, 项目的根目录中的 CmakeList.txt
在项目的根目录中创建 CmakeList.txt :
PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(CMAKE_SOURCE_DIR .)
#到目录 ./cmake/modules 中查找 Findlibdb_cxx.cmake
SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})
#查找链接库和头文件的过程
#到变量 CMAKE_MODULE_PATH 指示的目录中查找文件 Findlibdb_cxx.cmake 并执行
FIND_PACKAGE( libdb_cxx REQUIRED)
#标记已命名的缓冲变量为 advanced.
MARK_AS_ADVANCED(
LIBDB_CXX_INCLUDE_DIR
LIBDB_CXX_LIBRARIES
)
#如果 LIBDB_CXX_INCLUDE_DIR 和 LIBDB_CXX_LIBRARIES 都已经被赋值,则设置编译时到 LIBDB_CXX_INCLUDE_DIR 寻找头文件并且设置可执行文件 main 需要与链接库 LIBDB_CXX_LIBRARIES 进行连接。
IF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES
MESSAGE(STATUS "Found libdb libraries")
INCLUDE_DIRECTORIES(${LIBDB_CXX_INCLUDE_DIR})
MESSAGE( ${LIBDB_CXX_LIBRARIES} )
TARGET_LINK_LIBRARIES(main ${LIBDB_CXX_LIBRARIES}
)
ENDIF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES)
第三步,执行 cmake
生成 debug 版和 release 版的程序
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
cmake … -DCMAKE_BUILD_TYPE=Release/debug
字符串作为编译选项生成 Makefile