linux用cmake实验报告,Linux - CMake使用记录

news/2025/2/26 6:15:50

Ubuntu装好很久了,但一直没有开始正式地投入学习,最近意识到拖了太久,于是赶紧抓起来学习。

昨天到今天一直在研究CMake,这里就做一个记录。

首先记录一下,如何用CMake编译一个可执行程序:

假设有文件main.cpp,内有main函数,函数内编写了输出Hello world的简单代码。

想编译该代码,需要做以下几步

1.在代码目录下新建CMakeLists.txt

这个文件阐述了产生Makefile的细节,例如针对哪个平台怎么编译,编译哪几个文件,包含哪个静态库等等。在Windows下工作的时候,这些东西都是VS帮忙完成的,当然,在linux下也是有集成开发环境的,但CMake其实更加的强大。(至于具体怎么强大,慢慢就知道了)

2.编辑CMakeLists.txt,输入:

PROJECT(HELLO) #这条命令的意思是:工程名为HELLO

ADD_EXECUTABLE(hello main.cpp) #这条命令的意思是:生成一个可执行文件,名叫hello,编译main.cpp(如果有多个CPP,就都写上,以空格分割)。

保存,退出

3.在代码目录下输入cmake .(注意,这里有个“.”),回车

“.”的意思是当前目录,这个命令简单来讲就是根据当前目录下的CMakeLists.txt创建Makefile了,这时该目录下应该会出现Makefile以及CMake的一些中间文件

4.然后输入make(单线程编译)或者make -jN(多线程编译:例如make -j4,即使用4个线程编译),根据CMake生成的Makefile编译,此时,在该目录下应该就出现了一个名为hello的可执行文件了

接着,问题来了:如果代码目录下有很多文件,难道要在CMakeLists.txt里一一列举吗?这是何其蛋疼的事情?当然,CMake不会这样对待我们的。

只需在ADD_EXECUTABLE之前,加上命令:

FILE(GLOB_RECURSE SRC_LIST "*.cpp")

这个命令将把该目录下及所有子文件夹内的所有后缀为.cpp的文件的路径,全部放入SRC_LIST这个变量中。

然后,将ADD_EXECUTABLE这句修改一下,使用SRC_LIST这个变量作为ADD_EXECUTABLE的第二个参数:

ADD_EXECUTABLE(hello ${SRC_LIST}) #在CMakeLists中,引用变量的方法为${变量名}

这样一来,无论工程目录下有多少个文件,都无需再手动去修改CMakeLists.txt了。

当工程加入新的文件时,只需使用cmake .命令,让CMake重新生成Makefile就一切OK。

如果工程的文件/目录没有发生增删,要重新编译只需make命令就可以了。


http://www.niftyadmin.cn/n/1673936.html

相关文章

python安装sklearn流程_Autosklearn安装

如果有人问这个问题,我在尝试在OSX上安装时遇到了这个问题。作者可能遗漏了一些堆栈跟踪。即:Installing collected packages: pyrfrRunning setup.py install for pyrfr ... errorComplete output from command /Library/Frameworks/Python.framework/V…

1.3.2、Java基础下__一维数组定义,初始化方式,初始化值,特点,元素访问

Java系列文章目录 作者:Dcc_BigData 文章目录Java系列文章目录前言1、数组(array):2、特点3、分类:4、定义格式:5、数组的初始化6、数组元素访问7、数组内存结构8、数组操作常见问题9、数组元素的默认初始化…

c语言程序设计作业信息发布平台,C语言程序设计作业源程序之图书信息管理系统.doc...

C语言程序设计作业源程序之图书信息管理系统图书信息管理系统m_book.c#include struct node{ char name[10];int price;char pub[15];};extern struct node *add(),*del(struct node *);extern struct node *load(),*mhdel(struct node *);/**********************************…

如何获取ResultSet的行数和列数

2019独角兽企业重金招聘Python工程师标准>>> 当我们执行数据库查询返回一个ResultSet的时候,很多情况下我们需要知道这个ResultSet的大小,即它的行数和列数。我们知道它的列数可以通过resultSet.getMetaData().getColumnCount()很容易地得到&…

Tcl学习之--命名空间

Tcl解释器将全部的命令和全局变量分组管理。这些小组称为命名空间,一个命名空间中的命令和变量不会影响到还有一个命名空间。这些命名空间呈树形组织。一个命名空间的命令能够被还有一个命名空间引入。命名空间树的根就是全局命名空间,它包括了没有明白在…

dom 修改xml java_如何使用DOM方式修改XML文件内容

如何使用DOM方式修改XML文件内容发布时间:2020-07-09 15:23:57来源:亿速云阅读:125作者:Leah本篇文章为大家展示了如何使用DOM方式修改XML文件内容,代码简明扼要并且容易理解,绝对能使你眼前一亮&#xff0…

1.3.3、Java基础下__二维数组理解,定义,初始化,长度

Java系列文章目录 作者:Dcc_BigData 文章目录Java系列文章目录前言1、对于二维数组的理解2、二维数组定义格式(2种)3、二维数组的初始化4、动态初始化:5、静态初始化6、数组的长度7、数组元素的默认初始化值总结前言 本文要记录的大概内容: 二维数组理解…

c语言 函数多个参数,用C语言实现参数个数可变的函数

采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎样实现的…