После ./configure
звездочки в 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
На этом этапе в asterisk вы пытаетесь построить динамическую библиотеку. Поскольку эта динамическая библиотека может быть загружена в любое место памяти, все должно быть перемещаемым. Флаг -fPIC
означает Position Independent Code, код создается так, чтобы быть независимым от места загрузки - загружаться в любом месте.
Как часть этой сборки динамической библиотеки asterisk, он пытается ввести интерпретатор Lua. Поскольку он вводит динамическую библиотеку, ему нужно все скомпилированное PIC. Но вы используете статическую библиотеку lua, которая быланетсобрано с -fPIC. Он отклоняет это, так как объекты lua в статической библиотеке не могут быть перемещены.
КСТАТИ:вот почему добавление -fPIC
в сборку asterisk не поможет. Несовместимы не ваши объекты кода asterisk (на которые может повлиять -fPIC), а liblua.a, в частности объекты, переносимые liblua.a (например, lapi.o). Кроме того, вы собираете динамическую библиотеку в этой точке, и я уверен, что у вас уже есть перемещаемые флаги кода, такие как -fPIC для объектов asterisk, которые вы пытаетесь собрать вместе в этой точке.
Я вижу три решения.
Один из них — удалить lua из вашей сборки. Если вам это не нужно и вы больше думаете о том, что «позже с этим будет весело поиграться», вы можете сделать это и не потерять желаемые функции.
Другой способ — получить динамическую версию liblua,
liblua.so
на которую можно ссылаться в вашей сборке asterisk. Я не знаю вашего дистрибутива, поэтому не могу сказать, как ее получить.Другой, более болезненный, способ — пересобрать lua и liblua.a с -fPIC. У вас могут возникнуть проблемы с совместимостью из-за несоответствия флагов сборки (то, что вы сделали, и то, что еще есть на диске), поэтому я думаю, что лучшим вариантом будет найти liblua.so, который будет соответствовать вашему текущему собранному lua.
Если вы нашли liblua.so, вам, возможно, стоит обратить внимание на флаг компоновщика '-rpath', а именно '-Wl,-rpath,/path/to/lua/libs'