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


172

我刚刚继承了一些C ++代码,这些代码用一个包含主要功能和许多其他功能的cpp文件编写得很差。也有.h包含类及其函数定义的文件。

到目前为止,该程序是使用命令编译的g++ main.cpp。现在,我将类.h.cpp文件分开了,我是否需要使用makefile或仍可以使用g++ main.cpp命令?

Answers:


224

在main.cpp之后列出所有其他cpp文件。

g++ main.cpp other.cpp etc.cpp

等等。

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


152
您甚至可以做g++ *.cpp -o output
rubenvb

7
无论如何,这是一个坏习惯吗?我想在我的makefile文件中使用它。
gabriel_vincent 2013年

8
@gabriel_vincent,这不一定是坏习惯,但这意味着在数百个项目中编辑一个文件将使编译器为所有文件重做所有工作。单独编译允许进行增量编译。
保罗·德雷珀

@gabriel_vincent首先,您不应该手工编写makefile。请改用像CMake这样的正确构建系统。
Baum mit Augen

3
@BaummitAugen是的,除了我只想编译我在14分钟内编写的这个很小的2文件程序,我真的更愿意花1分钟写一个makefile,而不是花一个小时来设置cmake。
Przemek D

55

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

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

3
请注意,如果要在链接步骤中控制可执行文件的名称,请执行通常的操作:g++ -o my_executable myclass.o main.o
eric

22

现在,我已经将类分别划分为.h和.cpp文件,我需要使用makefile还是仍然可以使用“ g ++ main.cpp”命令?

如果要将其放入Makefile中,一次编译多个文件是一个糟糕的选择。

通常在Makefile中(对于GNU / Make),应该足以写出:

# "all" is 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也可以正确地重建由于头文件更改而需要重建的内容。


13

如果需要,您仍然可以直接使用g ++:

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

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


12

我知道这个问题是在几年前提出的,但仍然想分享我通常如何编译多个c ++文件。

  1. 假设您有5个cpp文件,您所要做的就是使用*而不是键入每个cpp文件名Eg g++ -c *.cpp -o myprogram
  2. 这将产生 "myprogram"
  3. 运行程序 ./myprogram

就这样!!

我使用*的原因是如果您有30个cpp文件怎么办?或只使用*号并节省时间:)

ps仅在不关心makefile时才使用此方法。


1
使用这种方法时会出现重新定义错误?还有另一种方法吗?
Waseem Ahmad Naeem

11

.h 文件与编译无关...您只关心cpp文件...所以键入 g++ filename1.cpp filename2.cpp main.cpp -o myprogram

表示您正在编译每个cpp文件,然后将它们链接在一起myprgram

然后运行你的程序 ./myprogram


7

正如rebenvp所说,我曾经使用过:

g++ *.cpp -o output

然后执行以下输出:

./output

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

另外,请确保已在.h文件中添加了所需的.cpp文件。


4

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



1

我曾经使用自定义的Makefile编译当前目录中的所有文件,但是每次都必须将其复制到需要的每个目录中。

因此,我创建了自己的工具-Universal Compiler,它在编译许多文件时使此过程变得更加容易。


-4

〜/ In_ProjectDirectory $ g ++ coordin_main.cpp coordin_func.cpp coordin.h

〜/ In_ProjectDirectory $ ./a.out

工作了!

在Geany IDE中使用Linux Mint

当我将每个文件保存到同一目录时,一个文件未正确保存在该目录中。coordin.h文件。因此,重新检查后将其保存为coordin.h,而不是-> coordin.h.gch。小东西。啊!


3
您被低估了,因为您包括了h文件,这是一个错误。
eric
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.