горе компоновщика - неопределенная ссылка

У меня есть проблема с моим компилятором, говоря мне существует 'неопределенная ссылка на' функцию, которую я хочу использовать в библиотеке. Позвольте мне совместно использовать некоторую информацию о проблеме:

  • Я - перекрестная компиляция с gcc для C.
  • Я называю библиотечную функцию, к которой получают доступ через включенный заголовок, который включает другой заголовок, который содержит прототип.
  • Я включал каталог заголовков с помощью-I, и я уверен, что это находится.
  • Я сначала создаю.o файлы, затем связывающие их в отдельной команде.

Таким образом, моя мысль - это, мог бы быть порядок, в который я включаю файлы библиотеки, но я не уверен, что корректный путь состоит в том, чтобы заказать им. Я попробовал включением папки заголовков и прежде и после.o файла.

Некоторые предлагают, было бы большим, и возможно и объяснение того, как компоновщик делает его вещь.

Спасибо!


Ответ на ответы

  • нет никакого.a файла библиотеки, просто.h и.c в библиотеке, таким образом-l не является соответствующим
  • мое понимание файла библиотеки - то, что это - просто набор заголовочных и исходных файлов, но возможно это - набор.o файлов, созданных из источника?!
  • нет никакого создаваемого файла объекта библиотеки, возможно, должно быть?? Да кажется, что я не понимаю, что различие между включает и библиотеки... я буду работать над этим :-)

Спасибо за все ответы! Я узнал много о библиотеках. Я хотел бы поместить все ответы как принятый ответ :-)

9
задан Richard 28 September 2008 в 12:43
поделиться

5 ответов

Это кажется, что Вы не компилируете.c файл в библиотеке для создания.o файла. Компоновщик искал бы реализацию прототипа в.o файле, произведенном путем компиляции библиотеки

Ваш процесс сборки компилирует библиотеку.c файл?

Почему Вы называете это "библиотекой", если это - на самом деле просто исходный код?

5
ответ дан 4 December 2019 в 15:28
поделиться

Я боюсь, что Вы смешали понятия заголовка и библиотека. Скажем, у Вас есть библиотека libmylib.a это содержит функцию myfunc() и соответствующий заголовок mylib.h это определяет его прототип. В Вашем исходном файле myapp.c Вы включаете заголовок, или непосредственно или включая другой заголовок, который включает его. Например:

/* myapp.h
** Here I will include and define my stuff
*/
...
#include "mylib.h"
...

Ваш исходный файл похож:

/* myapp.c
** Here is my real code
*/
...
#include "myapp.h"
...
/* Here I can use the function */
myfunc(3,"XYZ");

Теперь можно скомпилировать его для получения myapp.o:

gcc -c -I../mylib/includes myapp.c

Обратите внимание, что-I просто говорит gcc, где файлы заголовков, они не имеют никакого отношения к самой библиотеке!

Теперь можно связать приложение с реальной библиотекой:

gcc -o myapp -L../mylib/libs myapp.o -lmylib

Обратите внимание что -L переключатель говорит gcc, где библиотека, и -l говорит этому связывать Ваш код с библиотекой.

Если Вы не делаете этого последнего шага, можно встретиться с проблемой, которую Вы описали.

Могли бы быть другие более сложные случаи, но от Вашего вопроса, я надеюсь, что этого было бы достаточно для решения проблемы.

2
ответ дан 4 December 2019 в 15:28
поделиться

Заголовки предоставляют объявления функции и функциональные определения. Чтобы позволить компоновщику находят реализацию функции (и избавьтесь от неопределенной ссылки), необходимо попросить, чтобы драйвер компилятора (gcc) связал определенную библиотеку, где функция находится с помощью флага-l. Например,-lm свяжет математическую библиотеку. Страница руководства функции обычно указывает то, что библиотека, если таковые имеются, должна быть указана для нахождения функции.

Если компоновщик не может найти указанную библиотеку, можно добавить путь поиска библиотеки с помощью переключателя-L (например,-L/usr/local/lib). Можно также постоянно влиять на путь к библиотеке через переменную среды LIBRARY_PATH.

Вот некоторые дополнительные детали, чтобы помочь Вам отладить свою проблему. Условно названия файлов библиотеки снабжаются префиксом lib, и (в их статической форме) имеют.a расширение. Таким образом статически связанная версия математической библиотеки системы по умолчанию (тот Вы связываетесь с-lm) обычно находится в/usr/lib/libm.a. Видеть, какие символы данная библиотека определяют Вас, может выполнить nm - только определенный на файле библиотеки. В моей системе, выполняя команду на libm.a дает мне вывод как следующее.

e_atan2.o:
00000000 T atan2

e_asinf.o:
00000000 T asinf

e_asin.o:
00000000 T asin

Для наблюдения пути к библиотеке, который использует компилятор и какие библиотеки он загружает по умолчанию, можно вызвать gcc с-v опцией. Снова в моей системе это дает следующий вывод.

GNU assembler version 2.15 [FreeBSD] 2004-05-23 (i386-obrien-freebsd) 
using BFD version 2.15 [FreeBSD] 2004-05-23
/usr/bin/ld -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o 
/usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib /var/tmp//ccIxJczl.o -lgcc -lc 
-lgcc /usr/lib/crtend.o /usr/lib/crtn.o
5
ответ дан 4 December 2019 в 15:28
поделиться

Отправьте свой make-файл и библиотечную функцию, которую Вы пытаетесь назвать. Даже простые gcc make-файлы обычно имеют строку как это:

LIBFLAGS =-lc -lpthread -lrt -lstdc++ -lShared -L../shared

В этом случае это означает, связывают стандартную библиотеку для C, среди других

1
ответ дан 4 December 2019 в 15:28
поделиться

Я предполагаю, что необходимо добавить путь, где компоновщик может найти библиотеку. В gcc/ld можно сделать это с-L и библиотеку с-l.

- Ldir, - library-path=dir

Поисковый dir каталога перед стандартными поисковыми каталогами (эта опция должна предшествовать-l опции, которая ищет тот каталог).

- лиственница, - library=archive

Включайте дугу архивного файла в список файлов для соединения.


Ответ на ответы - нет никакого.a файла библиотеки, просто.h и.c в библиотеке, таким образом-l не является approriate

Затем Вам, вероятно, придется создать библиотеку сначала?

gcc -c mylib.c -o mylib.o
ar  rcs libmylib.a      mylib.o
0
ответ дан 4 December 2019 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: