Связывание математической библиотеки в GCC 4.6.1 (Ubuntu 11.10) - PullRequest
2 голосов
/ 21 ноября 2011

Я обнаружил проблему в процессе связывания моего приложения.У меня не было такого же с gcc 4.5.Он пытается связать математическую библиотеку с помощью следующей команды.

gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o -lm -L. -g -DASSERTS  -I../src// -I../ -I../src//src -DDEBUG -lmems_internals

и сообщает о следующих сообщениях об ошибках:

undefined reference to `sqrt'

Есть идеи?

Ответы [ 4 ]

7 голосов
/ 21 ноября 2011

В недавнем gcc / ld по умолчанию используется флаг компоновщика --as-required.На практике это означает, что библиотеки должны указываться в обратном порядке зависимостей в командной строке.Если для библиотеки mems_internals требуется функция sqrt, укажите -lm после -lmems_internals.

gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o  -L. -g -DASSERTS  -I../src// -I../ -I../src//src -DDEBUG -lmems_internals -lm
3 голосов
/ 13 февраля 2012

У меня была такая же проблема с gcc 4.6.1, даже с одной библиотекой.Это не работает:

$ gcc -lm eg.o -o eg
eg.o: In function `foo':
/home/nick/tmp/eg.c:5: undefined reference to `sqrt'
collect2: ld returned 1 exit status

Но это работает:

$ gcc eg.o -o eg -lm

Я ударил это, потому что я использовал "LDFLAGS = -lm" в моем MakefileРаботает нормально, если вы используете вместо этого "LDLIBS = -lm".

3 голосов
/ 21 ноября 2011

Вы не сказали нам, что такое -lmems_internals, но, возможно, оттуда исходит неразрешенный символ.Порядок параметров -l, как правило, важен для компоновщика, вы всегда должны ставить системные библиотеки последними.

Вы можете проверить, откуда появился неразрешенный символ, используя что-то вроде

nm yourLibrary | grep sqrt

если перед sqrt стоит U, то символ не определен.

0 голосов
/ 21 ноября 2011

Я бы сказал, что компоновщик использует неправильную библиотеку libm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...