我有一个基本的 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 $<
当我运行 make 时,我发现没有针对目标的规则:sharedlib
需要的 $(OBJECTS)/%.o
。虽然规则写在 sharedlib 之前。
最佳答案
主要问题是您没有明确告诉make您的源文件是什么。从这样做开始:
SOURCEDIR=/home/test/project/sources
SOURCES=$(wildcard $(SOURCEDIR)/*.c)
然后,通过将 .o
替换为 .c
来从源文件名派生目标文件名:
OBJECTDIR=/home/test/project/objects
OBJECTS=$(patsubst $(SOURCEDIR)/%.c,$(OBJECTDIR)/%.o,$(SOURCES))
您仍然可以保留构建目标文件的通用规则:
$(OBJECTDIR)/%.o: $(SOURCEDIR)/%.c
$(CC) -fPIC -c $^ -o $@
但是您将目标文件的显式列表提供给规则以创建 sharedlib
:
libsharedlib.so: $(OBJECTS)
$(CC) -shared -o $@ $<
请注意,我将规则的名称设置为与正在生成的文件相同的名称。这很重要,因为连续两次调用 make 将跳过第二次构建库。如果需要,您可以随时添加别名:
sharedlib: libsharedlib.so
在那种情况下,最好告诉 make sharedlib
不是一个真实的文件:
.PHONY sharedlib
如果目录中确实有一个名为 sharedlib
的文件,这可以防止发生奇怪的事情。
关于c - makefile 中无法识别规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40106300/