2013-06-20 2 views
0

Я работаю над довольно крупным и грязным проектом, который у меня на самом деле не хватает времени для очистки, и мне было поручено предоставить API для него. То, что я пытаюсь сделать, это обернуть все уродливые вещи в одну статическую библиотеку, а затем предоставить ей один файл заголовка.Ссылка на статическую библиотеку, состоящую из нескольких библиотек и объектных файлов с использованием одного файла заголовка

Но при попытке создать исполняемый файл с использованием файла заголовка и библиотеки я получаю кучу ошибок «неопределенной ссылки». Я предполагаю, что это сработает, если я предоставил все файлы заголовков, но я действительно не хочу этого делать.

Сейчас makefile выглядит (немного измененную для простоты), как это:

myprog.elf : libgiant_lib.a main.o 
    gcc -pg -o [email protected] main.o -lgiant_lib 

main.o : main.c 
    gcc -c $(CFLAGS) $(SOME_INCLUDES) $< -o [email protected] 

libgiant_lib.a : $(A_BUNCH_OF_LIBS) $(COUPLE_OF_OBJS) api.o 
    ar rcs [email protected] $^ 

api.o : api.c api.h 
    gcc -c $(CFLAGS) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o [email protected] 

Я проверил libgiant_lib.a архив и, кажется, содержит все библиотеки и файлы, которые он протестует. Но все же связь с ним не работает.

Я довольно уверен, что я что-то очевидное здесь отсутствует ...

+0

Итак, я решил только поместить объектные файлы в архив вместо этого, и теперь, кажется, работает как задумано. – user1986698

ответ

0

кажется мне, что ваши включаемые файлы могут содержать ссылки на другие включаемые файлы. Таким образом, вам нужно будет указать флаг для указания местоположения таких файлов. Я предлагаю предоставление местоположения (каталог, содержащий все включаемые файлы) в качестве

INCL_DIR =/включить/реж/место

и включения его в фазе компиляции, используя -I флаг. Например, ваше правило api.o станет

api.o: api.c api.h 
     gcc -c $(CFLAGS) -I$(INCL_DIR) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o [email protected] 
+0

Это на самом деле то, что '$ (INCLUDES_FOR_BUNCH_OF_LIBS)' (мое плохое, должно было назвать его лучше). Я никогда не указываю файлы заголовков в gcc, где они могут быть найдены. Возможно я должен? – user1986698

+0

И 'api.o' строит просто отлично, как есть. – user1986698

+0

Вы также должны сделать то же самое для main.o. – unxnut

Смежные вопросы