Makefile共享库错误

时间:2015-02-11 09:21:28

标签: linux makefile

我正在进行makefile测试,用于创建静态库并从中创建动态库。我的目录中有foo.h foo.c bar.c和main.c文件。 我写了一个Makefile如下:

#This 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 $@ $^

我可以像这样编写语句,因为在这两种情况下错误都是一样的。 我不明白我哪里出错了。感谢!!!!!

1 个答案:

答案 0 :(得分:1)

而不是libfoo.a(foo.o bar.o),而不是libfoo.a : foo.o bar.o


另一件事是.a文件通常是为了链接最终的可执行文件而构建的,因此.a的目标文件被编译为位置相关的代码。另一方面,共享库需要编译为与位置无关的代码。

因此,您可以:

  1. 摆脱libfoo.a
  2. 自动生成标头依赖项。
  3. 建立对目标的完全依赖关系,以便make -j可以正常运行。
  4. 设置rpath,以便run始终在其目录中找到libfoo.so
  5. 这样:

    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.*