В двух словах: компиляция и компоновка программы на c ++, которая встраивает lua с помощью команды g++ -o clua clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
, получая liblua5.1.so: undefined reference to 'dlopen'
среди других.
Я безуспешно пытался внедрить любой язык сценариев в мою игру на С ++ уже несколько недель, начиная с V8, через Python и Squirrel. Lua продается как «простая в настройке, маленькая» и т. Д., Поэтому я решил, что пойду с этим.
Я получил предварительно скомпилированные двоичные файлы от lua http://sourceforge.net/projects/luabinaries/files/5.1.5/Linux%20Libraries/ (Я использовал lua-5.1.5_Linux26g4_lib.tar.gz для моего 32bit Ubuntu) и иметь простой пример программы:
extern "C" {
#include "lua.h"#include "lualib.h"#include "lauxlib.h"}
int main()
{
lua_State *L = lua_open();
// load the libs
luaL_openlibs(L);
//run a Lua scrip here
luaL_dofile(L,"foo.lua");
printf("\nI am done with Lua in C++.\n");
lua_close(L);
return 0;
}
он сохраняется как «clua.cpp» и помещается в извлеченную папку (так что он находится в том же каталоге, что и «liblua5.1.a» и «liblua5.1.so»), а файлы заголовков lua находятся в папке с именем «включают»). Теперь я пытаюсь скомпилировать программу с помощью консоли, используя g ++, это точная команда:
g++ -o clua clua.cpp -c -Wall -Iinclude
И он работает без нареканий, не выдает ошибок и создает двоичный файл «clua», как и ожидалось. Когда я пытаюсь связать, однако:
g++ -o clua clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
Я получил:
liblua5.1.so: undefined reference to `dlopen'
liblua5.1.so: undefined reference to `dlclose'
liblua5.1.so: undefined reference to `dlerror'
liblua5.1.so: undefined reference to `dlsym'
collect2: error: ld returned 1 exit status
Я прочитал много ответов для людей, имеющих похожие вопросы, варианты представлены:
https://projects.coin-or.org/Ipopt/ticket/230 сказал добавление LDFLAGS="-Wl,--no-as-needed"
или же --enable-dependency-linking
Я должен был сделать свое дело, теперь я не был уверен, как именно должна выглядеть моя команда, ставить ли
g ++ -o clua LDFLAGS = «- Wl, — — по необходимости» — clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
или же
g++ -o clua -Wl --no-as-needed clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
,
g++ --enable-dependency-linking -o clua clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
или же
g++ -o clua clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl --enable-dependency-linking
но все они дали такие ошибки, как:
cc1plus: error: unknown pass dependency-linking specified in -fenable
https://projects.coin-or.org/Ipopt/ticket/229 сказал: «Еще один обходной путь — добавить флаг настройки —disable-pthread-mumps», я сделал это:
g ++ -o clua —disable-pthread-mumps clua.cpp -Wall -Iinclude -L liblua5.1.a liblua5.1.so -ldl
и получил
cc1plus: error: unknown pass pthread-mumps specified in -fdisable
Я запускал все это из каталога, где находились clua.cpp, liblua5.1.a и liblua5.1.so, и там была папка с именем «include», содержащая заголовки. Я запускаю это на 32-битной Ubuntu 13. (10, я думаю).
Теперь, что я могу сделать, чтобы правильно связать Lua?
-L liblua5.1.a liblua5.1.so
выглядит неправильно → варианты ссылок → -llua5.1
?
Затем, насколько я помню, в Ubuntu / Debian есть две разные библиотеки lua, одна из которых не позволяет динамически загружать библиотеки, поэтому -llua5.1-c++
и получить его: sudo apt-get install lua5.1 liblua5.1-dev
Мой совет: упростите, используйте генератор мета-make, если вы боретесь с GNU Make