CMake 入门教程
文章 CMake 语言 15 分钟入门教程 介绍了 CMake 语言的基础知识,本文在此基础上,进一步说明说明如何利用 CMake 生成 Makefile,并实现编译安装功能。
CMake 除了可以生成 Makefile 外,还可以生成以下 IDE 的编译文件:
- Xcode
- Visual Studio
- CodeBlocks
- Eclipse
CMake 生成可执行文件
先来看如何利用 CMake 编译单个 .cpp
源文件。需要编译的 main.cpp
1 |
|
创建 CMakeLists.txt
,CMakeLists.txt
与 main.cpp
处于同一目录。
1 | cmake_minimum_required(VERSION 2.8) |
CMake 使用 CMakeLists.txt
来生成不同平台下的编译文件,这里用于生成 Makefile。其中,add_executable
用于定义生成二进制可执行文件。install
用于将可执行文件安装到 bin
目录。
编写好 CMakeLists.txt
后,就可以对源文件进行编译了。
CMake 允许在与源文件独立的目录中编译源代码,以避免编译生成的中间文件与源文件混合一起。
在源文件目录下执行命令:
1 | mkdir _build |
然后执行 cmake
命令:
1 | cmake .. |
执行 cmake
命令后,会生成 Makefile 文件。
为编译 .cpp
源文件,执行:
1 | make |
make
命令会编译生成 hello
可执行文件。
然后可以将 hello
可执行文件安装到指定目录:
1 | make install |
可以看到输出:
– Installing: /usr/local/bin/hello
执行 hello
,可以终端打印出 “hello” 问候语。
上面的 make install
命令会将可执行文件安装到系统默认目录。如果需要指定其他目录,可以执行命令:
1 | cmake .. -DCMAKE_INSTALL_PREFIX=../_install |
这时,再执行 make install
,会看到输出:
/Users/lihao/code/c++/hello/_install/bin/hello
CMake 生成库文件
为方便演示,编写的库文件只包含一个简单对两个整数进行求各的函数,源文件 test.cpp
:
1 | int add(int a, int b) { |
其他源代码为了使用这个求和函数,需要包含其头文件,头文件包含该求和函数的声明。头文件 test.h
:
1 | int add(int a, int b); |
CMakeLists.txt
如下:
1 | cmake_minimum_required(VERSION 2.8) |
其中,
add_library
:用于指定生成库文件,STATIC
表明生成静态库文件libtest.a
install
:用于指定安装库文件,TARGETS
用于将成生成libtest.a
静态安装到目录lib
,FILES
用于将头文件test.h
安装到目录include
同理,创建 _build
目录,进入 _build
目录,然后分别执行 make
和 make install
,可以看到库文件和头文件被放置到了指定的位置:
– Installing: /usr/local/lib/libtest.a
– Installing: /usr/local/include/test.h
这样,其他源文件就可以引入使用这个库的求和函数。
CMake 链接库文件
我们继续演示可执行文件如何链接库文件。
创建新的目录 calllib
,其中,源文件 main.cpp
:
1 |
|
将上面的 test
库目录复制至 calllib
目录下。calllib/test/CMakeLists.txt
去掉 install
命令,调整为:
1 | cmake_minimum_required(VERSION 2.8) |
calllib/CMakeLists.txt
如下:
1 | cmake_minimum_required(VERSION 2.8) |
其中,
add_subdirectory
:用于指明子目录test
的CMakeLists.txt
及其源文件会被编译target_link_libraries
:用于指明可执行文件calllib
需要链接库test
。CMake 可以保证库test
会被行编译,然后再被链接到calllib
同样,创建 _build
目录,进入 _build
目录,执行 cmake ..
,生成 Makefile
文件后,执行 make
,这时输出:
Scanning dependencies of target test
[ 25%] Building CXX object test/CMakeFiles/test.dir/test.cpp.o
[ 50%] Linking CXX static library libtest.a
[ 50%] Built target test
Scanning dependencies of target calllib
[ 75%] Building CXX object CMakeFiles/calllib.dir/main.cpp.o
[100%] Linking CXX executable calllib
[100%] Built target calllib
可以看到,test
先编译,calllib
后编译。在生成可执行文件 calllib
时,链接了 test
库。
运行可执行文件 ./calllib
,终端可以正常输出求和值。
附:测试源文件
本文使用到完整的源文件可以在 GitHub 获取,地址:https://github.com/haozlee/cmake。