Makefile - 将静态库链接到动态库

时间:2018-01-18 09:03:37

标签: c++ makefile compilation static-libraries dynamic-library

假设我有这种文件夹层次结构:

main
  dir1
    file1.cpp/h
    file2.cpp/h
    makefile
  dir2
    file3.cpp/h
    makefile
  makefile

现在,每个内部makefile都将文件编译为目标文件并创建静态库(* .a)

我想从这些静态库构建一个共享对象(动态库)(让我们称之为 libdir1.a,libdir2.a

我在makefile上尝试了这条规则,但我接受了这个错误:

CC = g++

LDFLAGS = -shared
TARGET = libprog.so

$(TARGET): file1.o file2.o file3.o
         $(CC) $(LDFLAGS) -o $@ -Wl,-whole-archive -ldir1 -ldir2 -Wl,-no-whole-archive

(compiler output)
    libdir2.a: member libdir2.a(file1.h) in archive is not an object

我不知道错误是源于错误构建存档还是因为makefile的目标规则错误。

每个档案都是使用此规则构建的:

$(TARGET): [list_of_obj_files_that_were_created_on_this_dir]
    ar -r -o $@ $^

1 个答案:

答案 0 :(得分:0)

问题是我不小心将“h”文件包含在存档中。这是因为我使用了一个变量来存储目标文件,但是我没有很好地将数据放在上面,所以我认为变量只包含.o文件,但实际上它也有.h文件。