在您可以使用 makefile 进行任何操作之前,您必须知道如何在没有 makefile 的情况下进行操作。
由于您使用的是 gcc,我假设您的源代码是 C++。
您还没有告诉我们您的目录结构是什么样的,所以我假设您在两个目录中有三个源文件:primary/main.cc、other/foo.cc 和 other/bar.cc。 (我们可以稍后处理像foo.h 这样的头文件。)而你想构建myApp。
第 1 步:手工操作
要在一个命令中执行此操作,您可以使用:
gcc -Wall primary/main.cc other/foo.cc other/bar.cc -o myApp
这将编译三个源文件并将二进制对象链接到可执行文件myApp。
第 2 步:分段进行(在您可以完美完成上一步之前,请勿尝试此操作。)
您可以采取中间步骤,将源文件编译成二进制目标文件,而不是使用一个命令进行构建:
gcc -Wall -c primary/main.cc -o primary/main.o
gcc -Wall -c other/foo.cc -o other/foo.o
gcc -Wall -c other/bar.cc -o other/bar.o
这将产生alpha/main.o、beta/foo.o 和beta/bar.o。编译器不会抱怨foo 和bar 缺少main() 函数,因为目标文件不需要函数。 然后将这些对象链接到一个可执行文件中:
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
第 3 步:在本地进行(在您可以使上一步完美运行之前,请勿尝试此操作。)
就像上一步一样,但是我们在primary/和other/行动:
cd primary
gcc -Wall -c main.cc -o main.o
cd ../other
gcc -Wall -c foo.cc -o foo.o
gcc -Wall -c bar.cc -o bar.o
cd ..
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
第 4 步:使用 Makefile(在您可以使上一步完美运行之前,请勿尝试此操作。)
我们可以让 makefile 执行第 1 步,但这并不是必须的。在primary(即primary/makefile)中编写一个makefile,如下所示:
main.o:
gcc -Wall -c main.cc -o main.o
(gcc... 中的那个空格是一个制表符。)
现在试试这个:
cd primary
make
cd ../other
gcc -Wall -c foo.cc -o foo.o
gcc -Wall -c bar.cc -o bar.o
cd ..
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
第 5 步:使用多个 Makefiles(在您可以使上一步完美运行之前,请勿尝试此操作。)
写一个other/makefile:
both: foo.o bar.o
foo.o:
gcc -Wall -c foo.cc -o foo.o
bar.o:
gcc -Wall -c bar.cc -o bar.o
还有一个在顶层目录中的 makefile,你正在构建 myApp:
myApp:
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
现在试试这个:
cd primary
make
cd ../other
make
cd ..
make
第 6 步:使用一个调用其他人的 Makefile(在您可以使上一步完美运行之前,请勿尝试此操作。)
编辑顶层makefile:
myApp:
cd primary; make
cd other; make
gcc -Wall primary/main.o other/foo.o other/bar.o -o myApp
现在试试:
make
如果所有这些都有效,那么您所拥有的是一个粗略但有效的 makefile 系统。当您准备好卸下辅助轮时,可以进行许多改进。
编辑:
如果子目录中有许多源文件(例如other/),并且您不想手动维护顶级 makefile 中的列表,有几种方法可以处理它。这是一个:
OTHER_SOURCES := $(wildcard other/*.cc)
OTHER_OBJECTS := $(OTHER_SOURCES:.cc=.o)
myApp:
cd primary; make
cd other; make
gcc -Wall primary/main.o $(OTHER_OBJECTS) -o myApp
但在尝试进一步简化之前,您应该让这些 makefile 正常工作并理解它们。