如何编译具有多个源文件的项目

How do I compile a project with multiple source files?

本文关键字:源文件 项目 何编译 编译      更新时间:2023-10-16

我有一个主代码(.cpp)和一些其他文件(.cpp及其相应的.h文件),其中包含在我的主程序中使用的函数。我想知道如何编译我的文件和运行主代码。

这取决于你的编译器。例如,在GCC中,您可以这样写:

g++ foo.cpp bar.cpp baz.cpp -o foo # compile program
./foo                              # run program

Basile's right on,您需要构建机器拥有您可以轻松工作的软件。您真的希望能够运行make或类似的东西,并以可重复的方式快速重建您的项目。您还需要确保您的整个项目保持最新状态,重新构建依赖于已更改内容的所有内容。虽然您可以像ruakh的回答那样保留包含g++行的shell脚本,但这将不必要地重新编译超出您需要的内容。(这对小项目来说不是什么大事,但当项目变得越来越大时就变得很重要了。)

我只花了15分钟浏览OMake文档,但它看起来很有前途。make是系统上的标准,并提供了大量预定义的构建规则,包括c++的规则,所以为项目编写新的Makefile不是很困难。

它看起来像这样:

# the compiler and its flags
CXX = g++
CXXFLAGS = -Wall
PROGRAM = foo
OBJECTS = foo_a.o foo_b.o foo_c.o foo_d.o
.PHONY: all
.DEFAULT: all
all: $(PROGRAM)
$(PROGRAM): $(OBJECTS)

对象foo_a.o将从相应的源文件foo_a.cfoo_a.ccfoo_a.Cfoo_a.cppfoo_a.pfoo_a.ffoo_a.F等构建,适用于C、c++、Fortran、Pascal、Lex、Yacc等。

O'Reilly的make书在这一点上已经很过时了;.SUFFIX规则已经被模式规则所取代,但是在O'Reilly的书中没有涉及到模式规则。也就是说,如果完整的GNU Make文档不适合您,它仍然是一个很好的起点。

但真正的答案是使用一些构建机制,例如有一个Makefile并使用GNU Make。

有一些比GNU Make更好的构建器,比如Omake

构建器非常有用,因为在ruakh的例子中,当只有bar.cpp发生变化时,您可能不想重新编译foo.cpp,因此您需要考虑依赖关系。

(还有Makefile生成器,如automake, cmake…)