Попытка включить библиотеку, но продолжаю получать сообщения «неопределенная ссылка на»

43

Я пытаюсь использовать библиотеку libtommath. Я использую среду IDE NetBeans для своего проекта на Linux-сервере Ubuntu. Я загрузил и построил библиотеку, я сделал "make install", чтобы поместить полученный файл .a в/usr/lib/и .h файлы в /usr/include

Кажется, что найти файлы соответствующим образом (поскольку я больше не получаю эти ошибки, которые я делал до установки в директории /usr ).

Однако, когда я создаю простой основной вызов mp_init (который находится в библиотеке), я получаю следующую ошибку при попытке сделать свой проект:

mkdir -p build/Debug/GNU-Linux-x86
rm -f build/Debug/GNU-Linux-x86/main.o.d
gcc -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.c
mkdir -p dist/Debug/GNU-Linux-x86
gcc -o dist/Debug/GNU-Linux-x86/cproj1 build/Debug/GNU-Linux-x86/main.o
build/Debug/GNU-Linux-x86/main.o: In function 'main':
/home/[[myusername]]/NetBeansProjects/CProj1/main.c:18: undefined reference to `mp_init'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-Linux-x86/cproj1] Error 1

Итак, похоже, что компоновщик не может найти функцию внутри библиотеки, однако она есть, поэтому я просто не знаю, что может быть причиной этого. Любая помощь будет оценена.

Я получаю ту же ошибку, если я нахожу команду gcc напрямую и пропускаю make файл, я также убедился, что статическая библиотека также скомпилирована с помощью gcc.

Отредактировано для добавления:

Я получаю эти же ошибки, если я делаю компиляцию напрямую и добавляю библиотеку с -l или -L:

$ gcc -l /usr/lib/libtommath.a main.c 
/usr/bin/ld: cannot find -l/usr/lib/libtommath.a
collect2: ld returned 1 exit status

$ gcc -llibtommath.a main.c 
/usr/bin/ld: cannot find -llibtommath.a
collect2: ld returned 1 exit status

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status

$ gcc -Llibtommath.a main.c 
/tmp/ccOxzclw.o: In function `main':
main.c:(.text+0x18): undefined reference to `mp_init'
collect2: ld returned 1 exit status

Я очень ржавый на этом материале, поэтому я не уверен, что я использую правильную команду здесь, в примерах -L находятся найденные библиотеки? Если библиотека не найдена, как я могу ее найти, чтобы найти библиотеку? Он в /usr/lib, я пробовал его с .a файлом в текущем каталоге и т.д. Есть ли переменная среды, которую мне нужно установить? Если да, то как и т.д.

Большое спасибо за помощь.

Я пробовал совершенно другую библиотеку (GMP) и имел ТОЧНУЮ ту же проблему. Это должно быть какой-то проблемой среды Ubuntu? Кто-нибудь знает, как это исправить?

Теги:
static-libraries
linker-errors
compiler-errors
build

3 ответа

111

Трюк здесь заключается в том, чтобы поместить библиотеку ПОСЛЕ модуля, который вы компилируете. Проблема - эталонная вещь. Компоновщик решает ссылки по порядку, поэтому, когда библиотека ПЕРЕД Скомпилированным модулем, компоновщик запутывается и не считает, что нужны какие-либо функции в библиотеке. Поместив библиотеку ПОСЛЕ модуля, ссылки на библиотеку в модуле разрешаются компоновщиком.

  • 8
    +1 О, спасибо! Я знаю, что порядок разрешения ссылок имеет смысл, но это действительно помогает напомнить об этих фактах!
  • 1
    Это сработало для меня. Мой очень старый makefile работал, но теперь кажется, что компилятор становится слишком умным для своего блага :)
Показать ещё 4 комментария
33

Да, требуется добавить библиотеки после файлов исходных файлов/объектов. Эта команда решит проблему:

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath
  • 1
    +1 за написание правильного способа ссылки на libtommath.a
  • 0
    Вау, это довольно сложно. Спасибо что подметил это.
4

Если исходные файлы .c преобразуются в .cpp(например, как в parsec), то extern должен следовать "C", как в

extern "C" void foo();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню