Ошибка компоновщика (ln): не удается найти определенные файлы

980
n0pe

Я собираю что-то из исходного кода и получаю следующий вывод при запуске make:

 ... CC libpromises_la-mod_outputs.lo CC libpromises_la-unix.lo CCLD libpromises.la CC cfknow.o CC manual.o CCLD cf-know ./.libs/libpromises.so: undefined reference to `dlerror' ./.libs/libpromises.so: undefined reference to `dladdr' ./.libs/libpromises.so: undefined reference to `dlclose' ./.libs/libpromises.so: undefined reference to `dlopen' ./.libs/libpromises.so: undefined reference to `dlsym' collect2: ld returned 1 exit status gmake[2]: *** [cf-know] Error 1 gmake[2]: Leaving directory `/tmp/cfengine/cfengine-3.1.5/src' gmake[1]: *** [all] Error 2 gmake[1]: Leaving directory `/tmp/cfengine/cfengine-3.1.5/src' gmake: *** [all-recursive] Error 1 

Я немного погуглил, и кажется, что компоновщик не может найти определенные файлы. Мне никогда не приходилось сталкиваться с чем-то подобным, поэтому мне интересно, может ли кто-нибудь помочь мне расшифровать это сообщение и пролить свет на то, КАКОЙ файл не может быть найден и как я могу сообщить компоновщику, где он находится.

Я знаю, что ссылка исходит из libpromises.soдвоичного файла. Следовательно, открытие его в vi только дает мне мусор. Я должен искать libpromises.h? libpromises.c?

1
Вы уверены, что у вас установлены необходимые библиотеки? Это может быть ошибка невыполненных требований. new123456 12 лет назад 1
Я не очень разбираюсь в программировании на C, поэтому я не уверен, что это за библиотеки и как их искать. Предполагая, что они у меня есть, как я могу сказать компоновщику, где искать? n0pe 12 лет назад 0

1 ответ на вопрос

2
new123456

Вы должны иметь возможность редактировать Makefile и выполнить это быстро.

ПРИМЕЧАНИЕ. - Предполагается, что Makefile был создан GNU Autotools. Согласно tarfball Cfengine, они делают.

Сначала откройте Makefile и найдите флаг LDFLAGS. Это должно выглядеть примерно так:

LDFLAGS = -lfoo -lbar

Добавить в этот список -ldl. Это добавляет ссылку на библиотеку динамической загрузки.

Перекомпилируйте, и компоновщик должен быть в состоянии выполнить свою работу.


Переменная окружения LIBS - это переменная окружения, которая сообщает, ./configureкакие дополнительные библиотеки нужны, и затем вставляет их в Makefile (поэтому, чтобы ответить на ваш вопрос, на ./configureсамом деле не запускает компоновщик - он создает Makefile, который работает gccс параметрами, которые он получил от ./configure).

Итак, пользуйтесь LIBS=-ldl && ./configure.

Это похоже на забавный ответ, я могу редактировать Makefile :) Однако мне придется подождать до понедельника, чтобы вернуться к работе. Я отправлю, когда вернусь на работу и попробую это. n0pe 12 лет назад 0
Я просто попробовал это, и это не сработало. n0pe 12 лет назад 0
@MaxMackie Попробуйте это: `export LIBS = -ldl &&. / Configure`. Разорвано с [здесь] (http://www.linuxquestions.org/questions/linux-software-2/undefined-reference-to-%60dlopen-and-others-679867/). new123456 12 лет назад 1
Вау, я думаю, что это сработало. Brilliant! Не могли бы вы отредактировать свой ответ и объяснить, что делает переменная LIBS? И что именно этот флаг говорит компилятору / компоновщику? Спасибо. n0pe 12 лет назад 0

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