c++中的快速编译
Posted
技术标签:
【中文标题】c++中的快速编译【英文标题】:fast compilation in c++ 【发布时间】:2012-07-02 13:17:53 【问题描述】:我有一个具有许多功能的 c++ 程序,并且每个功能都有不同的 .cpp 文件。在主程序中,我只提供几个参数并调用函数。但是,完整的东西的编译需要很多时间。对于每次编译,我只更改主程序中的几个参数,并保留所有功能。 有没有办法加快编译速度?
【问题讨论】:
你要编译的命令行是什么?您使用的是 Makefile 还是其他构建工具? 可能会建议一些特定于平台/编译器的更改,但您没有指定您使用的是什么。 你用的是什么编译器?如果您添加该详细信息,您可能会得到更有针对性的答案。 我有一个 compile.sh 文件,其中有 g++ -o3 mainprog.cpp func1.cpp func2.cpp ..... -o output.out 每次我从命令行 如果您使用 gcc,请考虑预编译头文件:***.com/questions/58841/precompiled-headers-with-gcc 也正如其他人提到的使用 make。然后用多个线程运行它:make -j N 【参考方案1】:您正在重新编译不必要的代码。通常 IDE 会自动处理这个问题。否则,这取决于您如何编译代码。例如这样的行:
g++ *.cpp
或
g++ -o program a.cpp b.cpp c.cpp
非常慢,因为每次编译都会重新编译所有内容。
如果你正在编写 Makefile,你应该小心地编写它以避免重新编译。例如:
.PHONY: all
all: program
program: a.o b.o c.o
g++ -o $@ $^ $(LDFLAGS)
%.o: %.cpp
g++ $(CXXFLAGS) -o $@ $<
# other dependencies:
a.o: a.h
b.o: b.h a.h
c.o: c.h
在上面的示例中,更改c.cpp
会导致编译c.cpp
并链接程序。更改a.h
会导致编译a.o
和b.o
并链接程序。也就是说,在每次构建时,编译尽可能少的文件以使程序保持最新。
旁注:编写 Makefile 时要小心。如果您错过了一个依赖项,您可能无法编译足够的文件,并且您最终可能会遇到难以发现的分段错误(充其量)。还可以查看gcc
的手册,了解-M*
选项,您可以在其中使用gcc
本身生成依赖项,然后使用include
在Makefile
中生成输出。
【讨论】:
是的,我知道我没有必要重新编译所有函数文件。我只更改了主程序中的几个值。我从来没有写过make文件,如果你能告诉我怎么写,会很有帮助的,谢谢。 @SthitadhiRoy,只要尝试搜索“Makefile 教程”,您就会获得很多相关资源。如果您想要一个全面而又易于阅读的解释,您可以查看GNU make manual 本身。 他给了你一个完整的示例makefile,就在那里。将其保存到名为Makefile
的文件中,正确设置文件名(func1.o
而不是 a.o
或其他),查找文档,然后提出您有的任何具体问题。
@Shahbaz:关于依赖关系,也许指出一个自动生成它们的工具会很有用。很容易把它们弄错......
@MatthieuM。我同意。我相信我在某处读到 gcc (g++) 可以产生它,或者其他一些程序,但我不记得了。你知道吗?【参考方案2】:
尽量减少受参数更改影响的代码,最好只更改一个没有人依赖的源文件 (main.cpp)。
检查您的包含:您真的需要全部吗?尽可能使用前向声明(例如 #include 而不是 ),对于您自己的类,前向声明您能做的。
尝试使用 clang (llvm.org) 编译器。它有时比 gcc 编译得更快(假设您使用的是 linux/unix)并给出更多可读错误。
编辑:我假设你只是重新编译需要的东西。正如其他人建议的那样,使用构建系统(Makefile、IDE、CMake...)运行最少数量的编译。
【讨论】:
【参考方案3】:也许这会或不会有太大帮助,但我通过 ssh 运行代码,我知道运行/编译需要很长时间。如果您从数据文件中读取,而不是运行整个数据集,只运行一两个文件以查看您的预期结果。这将是您最终结果的样本,但仍应准确(只是统计数据较少)。一旦您调整了代码以使您满意,然后运行所有内容。 通常这样你不会有任何问题,而且你的编译时间相对来说要快得多。
【讨论】:
以上是关于c++中的快速编译的主要内容,如果未能解决你的问题,请参考以下文章