CMake入门

CMake入门

为什么要使用CMake呢?随着工程变得庞大,构建它会有很多文件的参与,手写Makefile等构建文件变得愈发困难且容易出错,使用CMake可以简化这个过程;也许,有一个智能的IDE能够帮助你构建文件,但当你把源代码发给别人时,可能对方并没有相应的工具,只能面对源文件措手无策,或者重新编写构建文件,而如果有CMake,则能由一个文件根据不同的平台生成相应的建构档,事情就会变得轻松而愉快。

参考链接:

基本的CMake项目

先从最简单的单文件做起,假设现在目录下有一个main.cpp文件:

#include <iostream>
int main() {
   
    std::cout << "Hello!";
}

我们可以在和源代码相同的目录下新建一个CMakeLists.txt,然后写入这样的内容:

cmake_minimum_required(VERSION 3.13)
project(cmake_test)

set(CMAKE_CXX_STANDARD 14)

add_executable(cmake_testapp main.cpp)

这个的例子来自CLion的教程。下面是每一行的解释:

命令 解释
cmake_minimum_required(VERSION 3.13) 指定CMake的最低版本要求,如果不加会有警告
project(cmake_test) project命令定义项目的名称
set(CMAKE_CXX_STANDARD 14) set命令用来给变量赋值,这里CMAKE_CXX_STANDARD变量用来指定所需最低的C++版本,这里要求C++版本最低为C++14
add_executable(cmake_testapp main.cpp) add_executable会添加一个生成可执行文件的“目标(target)”,目标的名字为cmake_testapp,其将从main.cpp被构建(build)

请读者留意“目标(target)”的概念,这在现代CMake中很是重要。

保存CMakeLists.txt文件,然后在命令行中输入cmake .,便会生成相应的构建文件。

不过通常我们不会在源代码的文件夹里直接构建,因为构建过程会生成很多文件,和源代码会在一起,显得比较杂乱。通常会新建一个目录,可以在当前目录,也可以在任何喜欢的地方,只要在这个目录下将CMakeLists.txt的位置告诉CMake就可以,然后在这个文件夹里面执行构建的操作,称为“Out of source building”。

比如我们在当前目录下新建一个build目录,然后在其中进行构建操作。这样,因为CMakeLists.txt的位置在上一级目录,可以用..表示。

Unix下会默认生成Makefile,生成后使用make命令执行。

mkdir build && cd build
cmake ..
make

Windows下默认生成Visual Studio的项目文件*.vcxproj

也可以使用-G命令指定生成的构建文件。如果之前生成的是其他构建文件,需要先删除构建目录下的CMakeCache.txt

cmake -G "MinGW Makefiles" ..

一个项目中可以有多个目标,我们可以指定多个生成可执行文件的目标。

比如我们有test1.cpptest2.cpp两个cpp,它们分别会生成不同的程序。可以新建两个名为test1test2的目标(名字随意),修改后的CMakeLists.txt如下所示:

cmake_minimum_required(VERSION 3.13)
project(cmake_test)

set(CMAKE_CXX_STANDARD 14)

add_executable(test1 test1.cpp)
add_executable(test2 test2.cpp)

修改过CMakeLists.txt之后,需要重新执行cmake操作。如果使用的是IDE,那么可能会自动进行这个过程,或者提示用户进行这个操作。

注:使用make时,可以用make <target>指定要生成的目标,比如make test1,默认全部执行。如果使用了IDE,可能会有下拉框以供选择。

多文件(一)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值