3

После ./configure asterisk в CentOS я набираю команду make, но получаю следующую ошибку

/usr/bin/ld: /usr/local/lib/liblua.a(lapi.o): relocation R_X86_64_32 against `luaO_nilobject_' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/liblua.a: could not read symbols: Bad value

Я попробовал это ./configure CFLAGS=-fPIC но получил ту же ошибку, что и выше.

1 ответ1

3

На этом этапе в звездочке вы пытаетесь создать динамическую библиотеку. Так как эта динамическая библиотека может быть загружена в любом месте памяти, все должно быть перемещено. Флаг -fPIC означает независимый от позиции код, код сделан независимым от места загрузки - загружается где угодно.

Как часть этой динамической сборки lib звездочки, он пытается ввести интерпретатор Lua. Поскольку он переносится в динамическую библиотеку, ему нужно все скомпилированное PIC. Но вы используете статическую библиотеку lua, которая не была собрана с -fPIC. Это отвергает это, поскольку объекты lua в статической lib не могут быть перемещены.

Кстати, именно поэтому добавление -fPIC к сборке звездочки не поможет. Несовместимы не ваши объекты кода звездочки (что может повлиять на -fPIC), а liblua.a, в частности, объекты, переносимые liblua.a (например, lapi.o). Кроме того, в этот момент вы создаете динамическую библиотеку, и я уверен, что у вас уже есть перемещаемые флаги кода, такие как -fPIC для объектов звездочки, которые вы пытаетесь собрать вместе в этот момент.

Я вижу три решения.

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

  • Другой способ - получить динамическую версию liblua, liblua.so , на которую можно ссылаться в вашей сборке звездочки. Я не знаю ваш дистрибутив, поэтому не могу сказать, как его получить.

  • Другой, более болезненный в заднице, это восстановить lua и liblua.a с -fPIC. У вас могут быть проблемы с совместимостью, возможно, из-за несовместимых флагов сборки (что вы сделали и что еще находится на диске), поэтому я думаю, что поиск liblua.so, соответствующий вашему текущему встроенному lua, является лучшим вариантом.

Если вы найдете liblua.so, вы можете посмотреть флаг связывания '-rpath' для этого, в частности, '-Wl, -rpath,/path/to/lua/libs'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .