cmake编译c++程序

当在Linux系统下编写程序时候,如果没有类似于visual studio、vs code等IDE(集成开发环境)时,如何编译、运行程序呢?一种方法是编写makefile文件,用makefile文件管理程序脚本之间的相互依赖关系,其语法相对比较复杂。另一种有效的方法就是利用cmake工具,自动生成makefile文件。

cmake是什么

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。Linux/Ubuntu上基本都预先安装好了cmake工具,用sudo apt-get install也可以自动安装。要使用cmake必须在工程的每个文件夹中都编写CMakeLists.txt,尤其注意C、M、L是大写,并且是复数形式。

hello, world!

话不多说,下面给出利用cmake进行编译并运行程序的例子,首先在建立一个名为ex1的文件夹,在其中建立程序源文件main.cpp和CMakeLists.txt

#main.cpp
#include <iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

#CMakeLists.txt
PROJECT(hello_world)
ADD_EXECUTABLE(hello main.cpp)

解释下上面的CMakeLists.txt,第一句是指生成一个名为hello_world的工程;第二句为基于main.cpp生成名为hello的可执行文件,非常容易。

注意cmake的命令不区分大小写,但一般建议使用大写的,然后,cmake的注释为#。

在terminal中,将路径改为当前文件夹中,先后运行

$cmake .

$make

此时文件中,hello文件,hello文件是编译之后的输出文件。

$./hello

可以看到输出结果:

Hello, world!

out-of-source编译

上述编译方法有个很大的问题,原本文件中仅有源文件和CMakeLists.txt,但是编译之后,文件夹中的文件如下所示:

CMakeCache.txt  cmake_install.cmake  hello     Makefile

CMakeFiles      CMakeLists.txt       main.cpp

多了很多编译过程文件和结果文件,这样的方式显然是不方便的。如果能够把编译的过程文件和结果文件放在另一个文件夹,那么文件结构就比较清晰,可以方便地编辑、修改源文件。

建立ex2文件夹,并且在ex2中建立src文件夹,和build文件夹。

首先,在ex2文件夹中,建立CMakeLists.txt,第一行是建立名为hello_world的工程,第二行添加src子文件夹

#CMakeLists.txt
PROJECT(hello_world)
ADD_SUBDIRECTORY(src)

然后,进入src文件夹,建立CMakeLists.txt,基于main.cpp生成名为hello的目标文件。

ADD_EXECUTABLE(hello main.cpp)

同样,main.cpp与上面相同

#main.cpp
#include <iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

然后,进入ex2/build文件夹,在terminal中

$cmake ..
$make

对程序进行编译,编译完成后,在build文件夹中生成了编译文件和src文件,src文件夹中有hello的结果文件,进入src文件夹中,在terminal中

$./hello

可以看到输出结果,说明编译正确

Hello, world!
上面是cmake的入门教程,cmake能够通过编写数行命令,编译程序,对于管理大型的软件系统很有帮组。



猜你喜欢

转载自blog.csdn.net/u012604810/article/details/79585344