我试图为一个多线程程序编写一个 makefile,该程序有一个执行两个从属进程的主进程。还有一个图书馆(供主人和奴隶使用)。
我不确定我应该如何编译这个库。
但有时,在文件上修改一个,makefile 命令不会重新编译它(它说与'all'无关)。
我试过这样写(Ubuntu):
all:executable
executable: slave1 slave 2 executable.o
gcc -o executable executable.o
slave1: slave1.o
gcc -o slave1 slave1.o
slave2: slave2.o
gcc -o slave2 slave2.o
library.o : library.c
gcc -c library.c
executable.o: executable.c
gcc -c executable.c
slave1.o: slave1.c
gcc -c slave1.c
slave2.o: slave2.c
gcc -c slave2.c
我也试过:
all:executable
executable: slave1 slave2
gcc -g -o executable executable.c
slave1:
gcc -g -o slave1 slave1.c library.c-lm
slave2:
gcc -g -o slave2 slave2.c library.c -lm
程序结构是这样定义的:
executable.c,slave1.c,slave2.c,library.c包含library.h
可执行运行slave1和slave 2
最佳答案
您的 makefile 完全错误。 makefile的一般结构如下:
target: prerequisite1 prerequisite2 ...
commands to make target (most probably using prerequisites)
所以:
all:executable
要使all
成为目标,我们必须使可执行
。对。
executable: slave1 slave 2 executable.o
gcc -o executable executable.o
从这些行看来,executable
依赖于 slave1
、slave
、2
和 executable .o
。下面的命令仅使用 executable.o
来创建 executable
,因此有不必要的先决条件(和错字)。
下一步:
slave1: slave1.o
gcc -o slave1 slave1.o
slave2: slave2.o
gcc -o slave2 slave2.o
看起来不错,直到您不需要 library.o 来构建它们。
下一步:
library.o : library.c
gcc -c library.c
此处是 library.o
,但它未使用作为任何目标的先决条件。所以它根本不会被构建。
executable.o: executable.c
gcc -c executable.c
slave1.o: slave1.c
gcc -c slave1.c
slave2.o: slave2.c
gcc -c slave2.c
那些看起来不错,但是 gcc 命令缺少 -o module.o
部分。
因此,如您所见,您的 makefile 几乎在所有可能的层面上都是错误的。
这是可以工作的 makefile。它可能更(更多)更紧凑,但为了清楚起见,我会这样写:
all: executable slave1 slave2
executable: executable.c
gcc -g -o executable executable.c
slave1: slave1.c library.c library.h
gcc -g -o slave1 slave1.c library.c -lm
slave2: slave2.c library.c library.h
gcc -g -o slave2 slave2.c library.c -lm
如您所见,这很简单。为了制作all
,我们必须构建executable
、slave1
和slave2
。 executable
依赖executable.c
,每个slaveX
二进制依赖slaveX.c
,库。 c
和 library.h
源代码。如果任何源文件发生变化,make
将重新编译目标。瞧。
关于一主两从的正确makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34886984/