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

1 ответ

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

Другие вопросы по тегам