如何编译包含多个源文件的项目?

Soh*_*rab 3 c++ linux compilation

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

rua*_*akh 7

这取决于您的编译器.例如,使用GCC,您可以写:

g++ foo.cpp bar.cpp baz.cpp -o foo # compile program
./foo                              # run program
Run Code Online (Sandbox Code Playgroud)

  • 在 Mac 上,“g++”实际上指向“clang”。执行上述操作会生成错误消息“clang:错误:生成多个输出文件时无法指定 -o” (2认同)

sar*_*old 5

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

我只花了十五分钟浏览 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)
Run Code Online (Sandbox Code Playgroud)

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

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