c - makefile 中无法识别规则?

标签 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 $<

当我运行 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/

相关文章:

将 C 可执行文件转换为 SIS 格式

c - 如何使用gdb进入while循环?

c++ - makefile文件名参数

java - 为什么没有人使用 make for Java?

c - 版本 `libssl.so.10' 未找到

c - 为什么我不能在不声明像 const 这样的矩阵的情况下进行编译

c - 神奇的段错误?

c make文件,如何制作一个能编译四个源文件的文件?

c++ - 在 Linux 上构建 Qt 共享库

websphere - 将共享库附加到 WebSphere 应用程序的模块