一主两从的正确makefile

标签 c makefile

我试图为一个多线程程序编写一个 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 依赖于 slave1slave2executable .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,我们必须构建executableslave1slave2executable依赖executable.c,每个slaveX二进制依赖slaveX.c库。 clibrary.h 源代码。如果任何源文件发生变化,make 将重新编译目标。瞧。

关于一主两从的正确makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34886984/

相关文章:

makefile:如何向基本名称添加前缀?

c++ - 将 natvis 文件中 char* 的显示限制为特定长度

c - 将 0 分配给 %ecx 寄存器

从 C 中的字符串中剪切子字符串

arrays - 将 char[] 与逗号分开

c - 拆分 c 文件并使用 Makefile

makefile - 为多核机器自动设置作业(-j)标志?

java - 我尝试编写自己的 makefile,但它不起作用

compiler-construction - 在 Makefile 中设置编译器名称

谁能帮我写一下这个C程序吗?