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 之前写的。
主要问题是你没有明确告诉 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在目录中调用了一个文件,这可以防止发生奇怪的事情。
| 归档时间: |
|
| 查看次数: |
298 次 |
| 最近记录: |