2015-04-21 4 views
-1

Я знаю, что было уже задавала много времени, но я не могу решить ... поэтому у меня есть src папку, где мой main.c источник есть, srclib где мой lib.c файл и каталог include, где хранится мой файл lib.h. теперь makefile правильно компилирует lib и помещает файл lib.a в папку lib. main.c включает в LIB, как это:GCC: неопределенная ссылка ххх

#include "lib.h" 

и это скомпилированные с -I ../include вариант, но когда я скомпилировать его я получаю ошибку undefined reference to xxx для каждой функции в библиотеке

так, что мне не хватает?

+1

'lib.a' - плохое имя для библиотеки, назовите его как' libfoo.a' и добавьте опции ссылки -Llib -lfoo' в gcc – qrdl

+0

, это просто пример, библиотека libSSL. команда завершения компиляции такова: 'gcc -Wall --pedantic -g -I ../ include -L ../ lib -w -L/usr/lib -lSSL s_echo.c -o ../bin/ ssl_server.out' –

ответ

4

Nope. -I предназначен для включения файлов заголовков. Вам также необходимо установить связь с библиотекой с помощью опции -l.

Примечание: вам может потребоваться предоставить путь к библиотеке с использованием опции -L.

процитировать online gcc manual

-llibrary

Поиск библиотеки имени библиотеки при компоновке ...... Компоновщик ищет стандартный список каталогов для библиотеки, которая на самом деле файл с именем liblibrary.a. Затем компоновщик использует этот файл, как если бы он был указан точно по имени.


EDIT:

Цитирую оставшуюся часть той же ручной

Это делает разницу где в команде записать этот вариант; компоновщик ищет и обрабатывает библиотеки и объектные файлы в том порядке, в котором они указаны. Таким образом, foo.o -lz bar.o ищет библиотеку z после файла foo.o, но до bar.o. Если bar.o относится к функциям в z, эти функции могут не загружаться.

Итак, вам нужно поставить -l<libanme> на последний из вашей компиляции заявления, поскольку s_echo.c использует функцию, определенную в этой конкретной библиотеке.

+0

Ehm ... '-L' не связывает библиотеки, он указывает путь поиска для библиотек. '-l' связывает библиотеки. – fuz

+0

@FUZxxl просто обновлял это. :-) –

+0

добавил '-l ../ lib', но он говорит' не может найти ../ lib' полная команда: 'gcc -Wall --pedantic -g -I ../include -w - g3 s_echo.c -o ../bin/ssl_server.out -L/usr/lib -lssl -l ../ lib' –

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