Ошибка связывания при обновлении с lua 4.0.1 до 5.1.4 - PullRequest
3 голосов
/ 03 августа 2011

Я работаю над действительно старым исходным кодом (скомпилированным в Red Hat). До этого у него был lua-4.0.1, поэтому я просто скомпилировал последний lua (lua-5.1.4) и установил его в тот же каталог, что и старый. Реализация не очень большая, так что не нужно было ничего менять, кроме нескольких имен функций, и мне пришлось включить «lauxlib.h», чтобы заставить его скомпилировать. Он компилируется без проблем, но выдает эти ошибки компоновки.

/usr/local/lib/liblua.a(loadlib.o): In function `ll_load':
loadlib.o(.text+0x19): undefined reference to `dlopen'
loadlib.o(.text+0x2a): undefined reference to `dlerror'
/usr/local/lib/liblua.a(loadlib.o): In function `ll_sym':
loadlib.o(.text+0x52): undefined reference to `dlsym'
loadlib.o(.text+0x63): undefined reference to `dlerror'
/usr/local/lib/liblua.a(loadlib.o): In function `ll_unloadlib':
loadlib.o(.text+0x8): undefined reference to `dlclose'

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

-static -lpthread -lnsl -lutil -ldl -lmysqlclient -llua -llualib -lz -lcppunit

Флаг ldl уже есть.

Я просто хочу знать, что попробовать. Все ценится. Это сводит меня с ума.

1 Ответ

5 голосов
/ 03 августа 2011

Поместите -ldl в конце команды лайнера.Порядок важен.

Компоновщик ищет библиотеки, выполняющие символ, на который нет ссылок, только в библиотеках, которые находятся в правой части командной строки.Ваш новый liblua.a теперь использует dlopen и друзей, а старший - нет.Поскольку -ldl осталось от -llua, компоновщик не использует libdl для связи ссылок lua.

...