Попытка встроить Lua в c ++, «неопределенная ссылка на« dlopen »& quot;

В двух словах: компиляция и компоновка программы на 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

Я прочитал много ответов для людей, имеющих похожие вопросы, варианты представлены:

  • добавив «-ldl», никакого эффекта нет
  • убедившись, что «-ldl» последний, сделал это тоже
  • 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?

2

Решение

-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

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector