Windows下使用命令行编译多個C++文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37818081/article/details/82791001

在进入正题之前先让我们把例子的工程结构梳理一下,我们会用一个最简单的类来演示,具体如下:

greet.h //"打招呼"类的头文件
greet.cpp //"打招呼"类的函数定义
app.cpp // 主函数文件

为了待会你更加理解控制台的输出,我还是决定把代码展示在下面,它们直白的可以让你一览而过:

// file name:	greet.h
// file description: this is a very simple class
// it has a member function that can say hello.
//

#ifndef _GREET_H_
#define _GREET_H_
#include <iostream>

class greet {
	public:
		greet() = default;
		void sayHello() const;
		//
		//...
		//
	private:
		//
		//...
		//
};
#endif

// the class greet's member functions define
//
#include "greet.h"

void greet::sayHello() const {
	//
	// Print a sentence, such as "Hello!"
	//
	std::cout << "Hello!";
}
// main function
//
#include "greet.h"

int main() 
{
	greet g;
	g.sayHello();
}

列出工程结构后,我们的目的也“昭然若揭”。我们通过这个例子展示命令行编译及链接多个代码文件的基本步骤和几种常用的方法。另外还引出里一个主题——makefile文件,提到这个文件,或许会勾起你的兴趣!

1,工具清单

我在这里提前列出了我所使用的基本配置和编译工具:

操作系统:Windows 10
编译工具:mingw(即gcc、 g++)
编辑工具:gvim(文本编辑器即可)

2,三种编译方法

在开始之前我还是想罗嗦几句,因为是在命令行下工作,我们总是需要把握当前我们身处的路径,擅用CD命令来转换路径,这样可以使得我们的工作得以正常进行……

  1. 使用g++直接一次性编译多个文件
    针对我们的工程这种方式的命令如下:
g++ app.cpp greet.cpp -o hello

我们用命令向编译器表达了我们的意思:我们需要编译app和greet这两个文件,并且输出(-o)一个名字为hello的结果。
下面的图片展示了我们整个的工作过程(注意,我的代码文件放在了e:\myProject路径下面),我们首先查看了这个路径下所有的文件,这可以和命令执行完后所输出的结果形成对比,接着我们执行了上面的命令,再一次输出所有文件的列表,果然生成了我们想要的hello.exe。那就键入hello来执行它,它也礼貌的向我们打了招呼!
第一种方式

  1. 先编译,后链接
    我们依旧是先展示出需要的命令,这次存在一个先后关系,所以需要的命令不止一条:
g++ -c greet.cpp
g++ -c app.cpp

我们用-c这个参数指示g++不要将工作一站到底,而是只完成一部分工作,有关这个参数的真实意义如下:

compile and assemble,but do not link //编译汇编,但不进行链接
//
// 可以在命令行键入g++ --help来获取各种参数所要执行的含义,例如可以
// 使用-S参数命令g++先完成更小的一部分工作(compile only,do not assemble and
// link)
//

这个命令为我们在当前目录里增加了两个文件(也就是编译汇编后的代码文件),我们接着使用命令让g++来完成链接的工作:

g++ app.o greet.o -o hello

hello.exe再次出现(为了说服你自己,最好把方式一中生成的hello.exe del掉,或者为方式二中的结果起一个更别致的名字!)
下图展示了我们的思路:
第二种方式

  1. 制作自动化工具makefile
    makefile文件的编写是另一个知识领域,它值得我们去学习和使用。通常,我们在类似Linux系统下安装一些程序或库的时候会遇到它。
    简单的说它就是把我们上面的命令单独写在一个文件里,然后我们通过一个专门的程序来解析这个文件从而为我们生成最终的可执行文件。当然,这说的的确够简单,毕竟它有专门的编写语法和格式,可以参考一些专门讲Linux下编程的书籍来深入学习,这里我们可以讨论一下使用makefile文件的好处:
    不知道你有没有写过Windows命令行下的脚本(一般以bat或者cmd作为文件后缀)它就像一个短小但是足够精悍的工具,帮你完成一些规律性的、重复的、反复的的工作,这点我觉得和makefile的目的类似。

对于一个大型的项目,里面可能有很多个文件。这时候如果每次编译都使用上面的方法显然是不切实际的。 这时候我们可以借助makefile文件,只需要写一次就可以进行多次编译,如果文件有增删直接修改makefile文件即可。

我们也可以试着在我们这个例子里面运用一个makefile文件帮助我们(尽管这个例子里没有必要这么做,但我们还是有必要知道)
我们的makefile文件内容展示在下面:
第三种方式
虽然我们不能读懂它,但是还是能隐约的感觉出它要表达的意思,它提供了一种描述,并且会像命令行脚本一样顺序的、一行行的向下执行,直到到最后的“终极目标”。

  1. 使用makefile
    我们需要用一个专门的程序来解析这个文件,由于我们使用的是mingw,所以我们将使用……\mingw64\bin目录下的mingw32-make程序(不同版本可能会有微妙的不同),首先我们需要确保我们命令行当前的工作路径中有makefile文件,然后执行如下命令:
e:\mingw64\bin\mingw32	-make	// 注意使用适合你所在环境的路径

当然我们也可以将才程序的路径加入我们的用户环境变量中,那样就可以省去前面那一堆绝对路径,而直接用程序的名字启动程序:

mingw32-make

这个程序会在当前我们的工作目录中寻找叫做makefile的文件然后解析其中的命令,而我们所写的命令就是编译、汇编并且链接生成可执行文件。至于怎么寻找makefile以及makefile的具体含义则不是一篇文章可以说完的,有关Linux下编程方面的书籍也许也可以帮你将此事水落石出!
下面的贴图展示了我们的思路:
思路

3,总结

来看看我们在唠唠叨叨的说了些什么,在命令行下我们有三种方式来编译我们的代码,可以一个命令让g++帮我们一站到底,但是如果我们对中间生成的代码有需求,我们可以命令g++分编译、汇编、链接分步骤完成,如果我们的工程逐渐壮大,似乎一句一句的敲命令变得枯燥、不可行,那么又引出了makefile文件和命令行脚本。
虽然没有展开讲gcc、g++、makefile、cmd的各种命令、参数和语法等等,但是既然你已经知道了他们的存在性,并且想让他们进一步为你工作,Start on the road!

参考文章:
https://www.cnblogs.com/yabin/p/7110485.html
参考书籍:
《Linux环境下C编程指南 第二版》
《程序员的自我修养——链接、装载与库》

展开阅读全文

没有更多推荐了,返回首页