проблема компиляции со статической библиотекой

Я создал статическую библиотеку libstuff.a с gcc и ar. Я установил библиотеку в /custom/lib/dir/ и заголовочные файлы в /custom/include/dir/. Когда я пытаюсь скомпилировать другое приложение из архива, у меня возникают проблемы.

Приложение, которое я пытаюсь скомпилировать, в основном использует gcc -L/custom/lib/dir/ -I/custom/include/dir/ -lstuff.

Когда я пытаюсь скомпилировать, я получаю сообщение об ошибке, связанное с функцией, которую я объявляю в stuff.h и определяю в stuff.c.

main.c:51: undefined reference to `stuff_init'
collect2: error: ld returned 1 exit status

Если я удаляю libstuff.a из /custom/lib/dir/, компилятор жалуется на /usr/bin/ld: cannot find -lstuff. Если я поставлю его обратно, он не жалуется. Значит правильно находит архив.

Если я удалю строку кода #include "stuff.h" из main.c, gcc жалуется на то, что stuff_init не определено, поэтому он правильно находит заголовки.

Если я запускаю nm libstuff.a, вывод включает 0000000000000000 T stuff_init. Итак, функция определена в файле архива.

Так что я делаю неправильно?


person Josh    schedule 25.03.2014    source источник
comment
Общая библиотека не создается с помощью àr(1), а libfoo.a является статической библиотекой. Проверьте инструкции по сборке.   -  person vonbrand    schedule 25.03.2014
comment
Извините, я хотел сказать статический вместо общего. Спасибо :)   -  person Josh    schedule 25.03.2014
comment
Вы действительно должны показать свою точную и полную командную строку связывания. В принципе нормально, но недостаточно конкретно.   -  person Jonathan Leffler    schedule 25.03.2014
comment
-lstuff перед объектными файлами в строке ссылки или после нее? Это должно быть после него   -  person Ernest Friedman-Hill    schedule 25.03.2014


Ответы (1)


Вы не показываете свою точную строку ссылки, но есть вероятность, что вам следует (но не указывать) список библиотек после объектных файлов:

gcc -o program main.o -L/custom/lib/dir -lstuff

Если существует более одного объектного файла вне библиотек, перечислите их все перед любой из библиотек. Параметры -L могут стоять где угодно перед параметром -llib, который использует библиотеку из данного каталога.

person Jonathan Leffler    schedule 25.03.2014
comment
Это решило это. У меня были флаги -l и -L перед моими объектными файлами. Спасибо! - person Josh; 25.03.2014