Попытка включить библиотеку, но продолжаю получать сообщения «неопределенная ссылка на» - PullRequest
55 голосов
/ 04 октября 2009

Я пытаюсь использовать библиотеку libtommath. Я использую IDE NetBeans для своего проекта в Ubuntu Linux. Я скачал и собрал библиотеку, я сделал '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? У кого-нибудь есть идеи, как это исправить?

Ответы [ 3 ]

132 голосов
/ 21 марта 2010

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

39 голосов
/ 14 января 2011

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

gcc -static -L/usr/lib -I/usr/lib main.c -ltommath
5 голосов
/ 15 февраля 2017

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

extern "C" void foo();
...