生成文件中无法识别规则?

Bio*_*441 1 c makefile shared-libraries

我有一个基本的 makefile 来编译编译共享库所需的 C 文件,我有一个错误,因为 makefile 无法识别:

 SOURCES=/home/test/project/sources
 OBJECTS=/home/test/project/objects

 $(OBJECTS)/%.o:$(SOURCES)/%.c
 $(CC) -fPIC -c $^ -o $@

 sharedlib: $(OBJECTS)/%.o
 $(CC) -shared -o libsharedlib.so $<
Run Code Online (Sandbox Code Playgroud)

当我运行 make 时,我发现目标没有规则:$(OBJECTS)/%.o需要sharedlib. 虽然规则是在 sharedlib 之前写的。

G. *_*pen 5

主要问题是你没有明确告诉 make 你的源文件是什么。从这样做开始:

SOURCEDIR=/home/test/project/sources
SOURCES=$(wildcard $(SOURCEDIR)/*.c)
Run Code Online (Sandbox Code Playgroud)

然后,通过替换.c为从源文件名派生目标文件名.o

OBJECTDIR=/home/test/project/objects
OBJECTS=$(patsubst $(SOURCEDIR)/%.c,$(OBJECTDIR)/%.o,$(SOURCES))
Run Code Online (Sandbox Code Playgroud)

您仍然可以保留通用规则来构建目标文件:

$(OBJECTDIR)/%.o: $(SOURCEDIR)/%.c
        $(CC) -fPIC -c $^ -o $@
Run Code Online (Sandbox Code Playgroud)

但是您将目标文件的明确列表提供给要 make 的规则sharedlib

libsharedlib.so: $(OBJECTS)
        $(CC) -shared -o $@ $<
Run Code Online (Sandbox Code Playgroud)

请注意,我使规则的名称与正在生成的文件相同。这很重要,因为连续调用 make 两次将跳过第二次构建库。如果需要,您可以随时添加别名:

sharedlib: libsharedlib.so
Run Code Online (Sandbox Code Playgroud)

在这种情况下,告诉 make 这sharedlib不是一个真正的文件也很好:

.PHONY sharedlib
Run Code Online (Sandbox Code Playgroud)

如果您确实sharedlib在目录中调用了一个文件,这可以防止发生奇怪的事情。