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

Posted

技术标签:

【中文标题】使用 G++ 编译多个 .cpp 和 .h 文件【英文标题】:Using G++ to compile multiple .cpp and .h files 【发布时间】:2011-03-13 05:48:21 【问题描述】:

我刚刚继承了一些 C++ 代码,这些代码用一个包含 main 和一堆其他函数的 cpp 文件编写得很糟糕。还有包含类及其函数定义的.h 文件。

到目前为止,程序是使用命令g++ main.cpp 编译的。现在我已经将这些类分隔为.h.cpp 文件,我需要使用makefile 还是仍然可以使用g++ main.cpp 命令?

【问题讨论】:

g++ *.cpp 足以编译所有 cpp 文件,因为只要我们还没有链接,顺序并不重要。 【参考方案1】:

在命令行中使用编译器时,您应该采取以下措施: 您不需要编译头文件,因为头文件在使用包含指令的脚本中被替换。 您将需要编译和链接实现和脚本文件。 例如让cow.h为头文件,cow.cpp为实现文件,cow.cc(c++文件可以有扩展名.cpp、.cc、.cxx、.C、.CPP、.cp)为脚本文件。 由于 c++ 文件的 gcc 编译器符号是 g++,我们可以使用来编译和链接文件

$g++ -g -Wall cow.cpp cow.cc -o cow.out

选项 '-g' 和 '-Wall' 用于调试信息和获取错误警告。这里的cow.out是我们可以执行来运行程序的可执行二进制文件的名称。命名您的可执行文件总是好的,否则会自动给出名称,这有时可能会令人困惑。 你也可以使用makefile来做同样的事情,makefiles会自动检测、编译和链接指定的文件。 有很多使用命令行编译的资源 enter link description here

【讨论】:

【参考方案2】:

现在我已经将类分离为 .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 也可以正确重建由于头文件更改而需要重建的内容。

【讨论】:

【参考方案3】:

如果你想在你的 cpp 文件中使用#include <myheader.hpp>,你可以使用:

g++ *.cpp -I. -o out

【讨论】:

有趣的是,我在使用这种 wildcrd 语法时收到filenotfound 错误,但如果我按名称单独包含所有文件,则它适用于相同的基本目录。【参考方案4】:

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

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

然后运行你的程序./myprogram

【讨论】:

【参考方案5】:

正如 rebenvp 所说,我使用过:

g++ *.cpp -o output

然后为输出执行此操作:

./output

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

同时确保您已在.cpp 文件中添加了所需的.h 文件。

【讨论】:

我正在使用 g++-10 并使用此通配符语法得到 fileNotFound 错误,但如果我包含具有相同目录路径的文件名(空格分隔),它工作正常... @987654329 @ 导致错误工作,但 g++-10 /abs/srs/path/file1.cpp /abs/src/path/file2.cpp -o /abs/src/path/binary_file 工作正常......这是什么疯狂?【参考方案6】:

我知道这个问题在几年前就被问过了,但仍然想分享我通常如何编译多个 c++ 文件。

    假设您有 5 个 cpp 文件,您所要做的就是使用 * 而不是输入每个 cpp 文件名,例如 g++ -c *.cpp -o myprogram。 这将生成"myprogram" 运行程序./myprogram

就是这样!!

我使用 * 的原因是,如果您有 30 个 cpp 文件,您会全部输入吗?或者只使用 * 符号并节省时间:)

p.s 仅当您不关心 makefile 时才使用此方法。

【讨论】:

使用这种方法出现重定义错误?还有其他方法吗? 对于重定义错误,您需要使用“包括警卫”#ifndef/#define/#endif。或者,如果您使用的是更现代的编译器,您可以使用#pragma once 我正在使用 g++-10 并使用此通配符语法得到 fileNotFound 错误,但如果我包含具有相同目录路径的文件名(空格分隔),它工作正常... @987654327 @ 导致错误工作,但 g++-10 /abs/srs/path/file1.cpp /abs/src/path/file2.cpp -o /abs/src/path/binary_file 工作正常......这是什么疯狂?【参考方案7】:

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

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

【讨论】:

请注意,如果您想在链接步骤中控制可执行文件的名称,只需执行您通常所做的操作:g++ -o my_executable myclass.o main.o 为什么不直接使用g++ *.cpp【参考方案8】:

~/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。小东西。 啊!!

【讨论】:

您被否决了,因为您包含了 h 文件,这是一个错误。【参考方案9】:

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

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

【讨论】:

【参考方案10】:

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

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

等等。

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

【讨论】:

你甚至可以做g++ *.cpp -o output 这是一个不好的做法吗?我想在我的 makefile 中使用它。 @gabriel_vincent,这不一定是坏习惯,但这意味着在数百个项目中编辑一个文件将导致编译器重做所有文件的所有工作。单独编译允许增量编译。 @gabriel_vincent 你不应该一开始就手动编写makefile。请改用 CMake 等适当的构建系统。 @BaummitAugen 是的,除了我只想编译这个我在 14 分钟内编写的小型 2 文件程序,我真的更愿意花 1 分钟而不是一个小时来编写一个 makefile设置 cmake。【参考方案11】:

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

【讨论】:

【参考方案12】:

如果你愿意,你仍然可以直接使用 g++:

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

其中 f1.cpp 和 f2.cpp 是其中包含函数的文件。详细如何使用make进行构建,请看优秀的GNU make documentation。

【讨论】:

以上是关于使用 G++ 编译多个 .cpp 和 .h 文件的主要内容,如果未能解决你的问题,请参考以下文章

Makefile用于将一些.cpp和.h编译成lib

在同一目录上使用 g++ 编译 .h 和 .cpp,错误

编译生成的h.gch文件是什么鬼?

如何避免每次重新编译所有文件?

使用g ++在同一目录下使用.cpp编译.h,错误

g++编译多个文件