CMake 入门教程

文章 CMake 语言 15 分钟入门教程 介绍了 CMake 语言的基础知识,本文在此基础上,进一步说明说明如何利用 CMake 生成 Makefile,并实现编译安装功能。

CMake 除了可以生成 Makefile 外,还可以生成以下 IDE 的编译文件:

  • Xcode
  • Visual Studio
  • CodeBlocks
  • Eclipse

CMake 生成可执行文件

先来看如何利用 CMake 编译单个 .cpp 源文件。需要编译的 main.cpp

#include <iostream>
using namespace std;

int main()
{
	cout << "hello" << endl;
	return 0;
}

创建 CMakeLists.txtCMakeLists.txtmain.cpp 处于同一目录。

cmake_minimum_required(VERSION 2.8)

project(hello)

add_executable(hello main.cpp)

install(TARGETS hello DESTINATION bin)

CMake 使用 CMakeLists.txt 来生成不同平台下的编译文件,这里用于生成 Makefile。其中,add_executable 用于定义生成二进制可执行文件。install 用于将可执行文件安装到 bin 目录。

编写好 CMakeLists.txt 后,就可以对源文件进行编译了。

CMake 允许在与源文件独立的目录中编译源代码,以避免编译生成的中间文件与源文件混合一起。

在源文件目录下执行命令:

mkdir _build
cd _build

然后执行 cmake 命令:

cmake ..

执行 cmake 命令后,会生成 Makefile 文件。

为编译 .cpp 源文件,执行:

make

make 命令会编译生成 hello 可执行文件。

然后可以将 hello 可执行文件安装到指定目录:

make install

可以看到输出:

– Installing: /usr/local/bin/hello

执行 hello,可以终端打印出 “hello” 问候语。

上面的 make install 命令会将可执行文件安装到系统默认目录。如果需要指定其他目录,可以执行命令:

cmake .. -DCMAKE_INSTALL_PREFIX=../_install

这时,再执行 make install,会看到输出:

/Users/lihao/code/c++/hello/_install/bin/hello

CMake 生成库文件

为方便演示,编写的库文件只包含一个简单对两个整数进行求和的函数,源文件 test.cpp

int add(int a, int b) {
	return a + b;
}

其他源代码为了使用这个求和函数,需要包含其头文件,头文件包含该求和函数的声明。头文件 test.h

int add(int a, int b);

CMakeLists.txt 如下:

cmake_minimum_required(VERSION 2.8)

project(test)

add_library(test STATIC test.cpp)

install(TARGETS test DESTINATION lib)
install(FILES test.h DESTINATION include)

其中,

  • add_library:用于指定生成库文件,STATIC 表明生成静态库文件 libtest.a
  • install:用于指定安装库文件,TARGETS 用于将成生成 libtest.a 静态安装到目录 libFILES 用于将头文件 test.h 安装到目录 include

同理,创建 _build 目录,进入 _build 目录,然后分别执行 makemake install,可以看到库文件和头文件被放置到了指定的位置:

– Installing: /usr/local/lib/libtest.a
– Installing: /usr/local/include/test.h

这样,其他源文件就可以引入使用这个库的求和函数。

CMake 链接库文件

我们继续演示可执行文件如何链接库文件。

创建新的目录 calllib ,其中,源文件 main.cpp

#include <iostream>
#include "test/test.h"

int main() {
	int sum = add(1, 2);
    std::cout << sum << std::endl;
    return 0;
}

将上面的 test 库目录复制至 calllib 目录下。calllib/test/CMakeLists.txt 去掉 install 命令,调整为:

cmake_minimum_required(VERSION 2.8)

project(test)

add_library(test STATIC test.cpp)

calllib/CMakeLists.txt 如下:

cmake_minimum_required(VERSION 2.8)

project(calllib)

add_subdirectory(test)

add_executable(calllib main.cpp)

target_link_libraries(calllib test)

其中,

  • add_subdirectory:用于指明子目录 testCMakeLists.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

参考资料

  • https://mirkokiefer.com/cmake-by-example-f95eb47d45b1
  • https://medium.com/@onur.dundar1/cmake-tutorial-585dd180109b
  • https://www.hahack.com/codes/cmake/
  • Linux 程序设计,第 4 版,Neil Matthew 等著
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值