使用G++编译多个.cpp和.h文件

240

我继承了一些C++代码,这些代码被糟糕地编写在一个cpp文件中,其中包含主函数和一堆其他函数。同时还有一些包含类和它们的函数定义的.h文件。

直到现在,该程序是使用命令g++ main.cpp进行编译的。现在我已经将类分离到.h和.cpp文件中,我需要使用一个makefile吗?还是仍然可以使用g++ main.cpp命令?


1
g++ *.cpp足以编译所有的cpp文件,因为只要我们还没有链接,顺序并不重要。 - aderchox
13个回答

306
列出 main.cpp 之后的所有其他 cpp 文件。例如:
g++ main.cpp other.cpp etc.cpp

或者你可以单独编译它们。然后将所有生成的 ".o" 文件链接在一起。


217
你甚至可以执行 g++ *.cpp -o output - rubenvb
8
这是不是一个不良习惯?我想在我的 makefile 中使用它。 - gabriel_vincent
16
@gabriel_vincent,这不一定是个不好的做法,但这意味着在一个由数百个文件组成的项目中编辑一个文件会导致编译器为所有文件重新执行工作。分别编译允许增量编译。 - Paul Draper
2
@gabriel_vincent 你不应该手写makefile。最好使用像CMake这样的适当的构建系统。 - Baum mit Augen
8
是的,除了我想编译这个我在14分钟内写的仅有两个文件的小程序,我宁愿花费1分钟来编写一个makefile,而不是花费一小时来设置cmake。 - Przemek D
显示剩余6条评论

83

要单独编译而不链接,您需要添加-c选项:

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out

5
请注意,如果您想在链接步骤中控制可执行文件的名称,只需按照通常的方法进行:g++ -o my_executable myclass.o main.o - eric
2
为什么不直接使用“g++ *.cpp”呢? - Ankit Mishra

26
现在我已经将类分离到.h和.cpp文件中,我是否需要使用makefile或者仍然可以使用"g++ main.cpp"命令?
如果你要将多个文件一起编译,那么将它们放入Makefile中是一个不好的选择。
通常在Makefile(对于GNU/Make),只需要写入以下内容即可:
# "all" is the name of the default target, running "make" without params would use it
all: executable1

# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker
CC=$(CXX)

# tell which files should be used, .cpp -> .o make would do automatically
executable1: file1.o file2.o

那样,make只会重新编译需要重新编译的内容。还可以添加一些微调来生成头文件依赖关系,这样make也可以正确地重新构建由于头文件更改而需要重新构建的内容。

第一个目标不是默认目标吗? - Peter - Reinstate Monica
同样,一个正确的Makefile必须将头文件列为依赖项,否则更改一个头文件后不会重新编译。我不确定在这种情况下是否也必须将cpp文件列出,当然这样做就不太优雅了。 - Peter - Reinstate Monica

21

我知道这个问题几年前就被问过了,但是我还是想分享一下我通常如何编译多个c++文件的方法。

  1. 假设你有5个cpp文件,你只需使用星号(*)代替每个cpp文件的名称。例如:g++ -c *.cpp -o myprogram
  2. 这将生成“myprogram”。
  3. 运行程序: ./myprogram

就是这些啦!!

我使用 * 的原因是如果你有30个cpp文件,是不是要打出全部的文件名?还是直接使用 * 符号节省时间呢 :)

附:仅在您不关心makefile时使用此方法。


1
当我使用这种方法时,会出现重新定义错误?有没有其他的方法可以做同样的事情? - Waseem Ahmad Naeem
对于重定义错误,您需要使用“包含保护”#ifndef/#define/#endif。或者,如果您使用的是更现代的编译器,则可以使用#pragma once - ThisGuyCantEven
我正在使用g++-10,并且在使用通配符语法时遇到了“fileNotFound”错误,但是如果我包含相同目录路径下的文件名(以空格分隔),它就可以正常工作... g++-10 /abs/src/path/*.cpp -o /abs/src/path/binary_file 会出错,但是 g++-10 /abs/srs/path/file1.cpp /abs/src/path/file2.cpp -o /abs/src/path/binary_file 可以正常工作...... 这是什么鬼? - ThisGuyCantEven

21

.h文件与编译无关...只需关心cpp文件...所以输入以下命令:g++ filename1.cpp filename2.cpp main.cpp -o myprogram

这意味着你正在编译每个cpp文件,然后将它们链接在一起成为myprogram

然后运行程序 ./myprogram


16

如果你想的话,仍然可以直接使用 g++:

g++ f1.cpp f2.cpp main.cpp

f1.cpp和f2.cpp是包含函数的文件。有关如何使用make进行构建的详细信息,请参阅优秀的GNU make文档


13

正如rebenvp所说,我使用了:

g++ *.cpp -o output

然后为输出做这个:

./output

但更好的解决方案是使用make文件。在此处阅读有关make文件的更多信息。这里

还要确保您已将所需的.h文件添加到.cpp文件中。


我正在使用g++-10,并且在使用通配符语法时遇到了“fileNotFound”错误,但是如果我包含相同目录路径下的文件名(以空格分隔),它就可以正常工作... g++-10 /abs/src/path/*.cpp -o /abs/src/path/binary_file 会出错,但是 g++-10 /abs/srs/path/file1.cpp /abs/src/path/file2.cpp -o /abs/src/path/binary_file 可以正常工作...... 这是什么鬼? - ThisGuyCantEven

4
您可以使用多个g++命令然后进行链接,但最简单的方法是使用传统的Makefile或其他构建系统:如Scons(通常比Makefiles更容易设置)。

3
如果你想在你的cpp文件中使用#include <myheader.hpp>,你可以使用以下方法:
g++ *.cpp -I. -o out

有趣的是,当我使用通配符语法时,会出现“文件未找到”错误,但如果我逐个按名称包含所有文件,则在相同的基本目录下可以正常工作。 - ThisGuyCantEven

2

假设所有需要的.cpp.h文件都在同一个文件夹中,您可以使用单个命令来完成此操作。

g++ *.cpp *.h -Wall && ./a.out

它将同时编译和执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接