Makefile共享库错误
Makefile shared library error
我正在做创建静态库和从中创建动态库的 makefile 测试。我的目录中有 foo.h foo.c bar.c 和 main.c 文件。
我写了一个 Makefile 如下:
#这个 makefile 演示了共享库和静态库的创建。
CFLAGS = -Wall -Werror -fPIC
CFLAGS1 = -Wall
inc = /home/betatest/Public/implicit-rule-archive
all : foo.o bar.o libfoo.a libfoo.so run
foo.o: foo.c foo.h
@echo "Making the foo.o"
$(CC) -c $(CFLAGS) $< -o $@
bar.o : bar.c foo.h
@echo "Making the bar.o"
$(CC) -c $(CFLAGS) $< -o $@
libfoo.a(foo.o bar.o) : foo.o bar.o
ar cr $@ $^
libfoo.so : libfoo.a
$(CC) -shared -o $@ $^
run : main.c
$(CC) -L$(inc) $(CFLAGS1) -o $@ $< -lfoo
.PHONY : clean
clean :
-rm -f *.o run libfoo.*
制作时出现以下错误:
Making the foo.o
cc -c -Wall -Werror -fPIC foo.c -o foo.o
Making the bar.o
cc -c -Wall -Werror -fPIC bar.c -o bar.o
make: *** No rule to make target 'libfoo.a', needed by 'all'. Stop.
我把存档语句写成:
libfoo.a(foo.o bar.o) : foo.o bar.o
ar cr $@ $^
从这个到:
libfoo.a(*.o) : *.o
ar cr $@ $^
我可以这样写语句吗,因为在这两种情况下,错误是一样的。
我不明白我哪里出错了。谢谢!!!!!
而不是 libfoo.a(foo.o bar.o)
你想要普通的 libfoo.a : foo.o bar.o
.
另一件事是 .a
文件通常是为链接最终可执行文件而构建的,因此 .a
的 object 文件被编译为 position-dependent 代码。另一方面,共享库需要编译为与位置无关的代码。
因此,您可以:
- 去掉
libfoo.a
.
- 自动生成 header 依赖项。
- 建立对目标的完全依赖关系,以便
make -j
稳健地工作。
- 设置 rpath 以便
run
总能在其目录中找到 libfoo.so
。
这样:
CFLAGS = -Wall -Werror
LDFLAGS = -L/home/betatest/Public/implicit-rule-archive -Wl,-rpath,'$$ORIGIN'
all : run
run : main.o libfoo.so
$(CC) $(LDFLAGS) -o $@ $^
libfoo.so : CFLAGS += -fPIC # Build objects for .so with -fPIC.
libfoo.so : foo.o bar.o
$(CC) -shared -o $@ $^
# Compile any .o from .c. Also make dependencies automatically.
%.o : %.c
$(CC) -c $(CFLAGS) -o $@ -MD -MP $<
# Include dependencies on subsequent builds.
-include $(wildcard *.d)
.PHONY : all clean
clean :
-rm -f *.o *.d run libfoo.*
我正在做创建静态库和从中创建动态库的 makefile 测试。我的目录中有 foo.h foo.c bar.c 和 main.c 文件。 我写了一个 Makefile 如下:
#这个 makefile 演示了共享库和静态库的创建。
CFLAGS = -Wall -Werror -fPIC
CFLAGS1 = -Wall
inc = /home/betatest/Public/implicit-rule-archive
all : foo.o bar.o libfoo.a libfoo.so run
foo.o: foo.c foo.h
@echo "Making the foo.o"
$(CC) -c $(CFLAGS) $< -o $@
bar.o : bar.c foo.h
@echo "Making the bar.o"
$(CC) -c $(CFLAGS) $< -o $@
libfoo.a(foo.o bar.o) : foo.o bar.o
ar cr $@ $^
libfoo.so : libfoo.a
$(CC) -shared -o $@ $^
run : main.c
$(CC) -L$(inc) $(CFLAGS1) -o $@ $< -lfoo
.PHONY : clean
clean :
-rm -f *.o run libfoo.*
制作时出现以下错误:
Making the foo.o
cc -c -Wall -Werror -fPIC foo.c -o foo.o
Making the bar.o
cc -c -Wall -Werror -fPIC bar.c -o bar.o
make: *** No rule to make target 'libfoo.a', needed by 'all'. Stop.
我把存档语句写成:
libfoo.a(foo.o bar.o) : foo.o bar.o
ar cr $@ $^
从这个到:
libfoo.a(*.o) : *.o
ar cr $@ $^
我可以这样写语句吗,因为在这两种情况下,错误是一样的。 我不明白我哪里出错了。谢谢!!!!!
而不是 libfoo.a(foo.o bar.o)
你想要普通的 libfoo.a : foo.o bar.o
.
另一件事是 .a
文件通常是为链接最终可执行文件而构建的,因此 .a
的 object 文件被编译为 position-dependent 代码。另一方面,共享库需要编译为与位置无关的代码。
因此,您可以:
- 去掉
libfoo.a
. - 自动生成 header 依赖项。
- 建立对目标的完全依赖关系,以便
make -j
稳健地工作。 - 设置 rpath 以便
run
总能在其目录中找到libfoo.so
。
这样:
CFLAGS = -Wall -Werror
LDFLAGS = -L/home/betatest/Public/implicit-rule-archive -Wl,-rpath,'$$ORIGIN'
all : run
run : main.o libfoo.so
$(CC) $(LDFLAGS) -o $@ $^
libfoo.so : CFLAGS += -fPIC # Build objects for .so with -fPIC.
libfoo.so : foo.o bar.o
$(CC) -shared -o $@ $^
# Compile any .o from .c. Also make dependencies automatically.
%.o : %.c
$(CC) -c $(CFLAGS) -o $@ -MD -MP $<
# Include dependencies on subsequent builds.
-include $(wildcard *.d)
.PHONY : all clean
clean :
-rm -f *.o *.d run libfoo.*