Makefile - связать статические библиотеки с динамической библиотекой

Предположим, у меня есть эта иерархия папок:

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

Теперь каждый внутренний make-файл компилирует файлы в объектные файлы и создает статическую библиотеку (*.a).

Я хочу создать общий объект (динамическую библиотеку) из этих статических библиотек (назовем их libdir1.a, libdir2.a)

Я попробовал это правило в make-файле, но принял эту ошибку:

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

Я не знаю, происходит ли ошибка из-за неправильного построения архива или из-за неправильного целевого правила make-файла.

Каждый архив был построен с этим правилом:

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

person binyamina    schedule 18.01.2018    source источник
comment
Вы, кажется, поместили заголовочный файл в свой архив. Не делай этого.   -  person Mat    schedule 18.01.2018
comment
Какой у тебя [list_of_obj_files] ?   -  person 眠りネロク    schedule 18.01.2018
comment
@Mat - как видно из правила создания архива, в архив включаются только файлы .o   -  person binyamina    schedule 18.01.2018
comment
@水飲み鳥 - Я редактировал список, смотрите там   -  person binyamina    schedule 18.01.2018
comment
Инструменты обычно не врут (хотя иногда бывают баги). Если они говорят, что у вас есть файл .h в вашем архиве, скорее всего, это правда. Пришло время внимательно изучить ваши команды создания архива. [list_of_obj_files_that_were_created_on_this_dir] — это ваша интерпретация того, что делается. Каковы факты, то есть фактические неотредактированные команды?   -  person n. 1.8e9-where's-my-share m.    schedule 18.01.2018
comment
Кроме того, попробуйте удалить и восстановить архивы. Если вы случайно вставили файл .h в один, он останется. ar r не создает весь архив с нуля, а только заменяет или добавляет указанные элементы.   -  person n. 1.8e9-where's-my-share m.    schedule 18.01.2018


Ответы (1)


Проблема была в том, что я случайно включил в архив файл "h". Это было потому, что я использовал переменную для хранения объектного файла, но я не помещал в нее данные, поэтому я думал, что переменная включает только файлы .o, но на самом деле у нее были и файлы .h.

person binyamina    schedule 18.01.2018