Включить Alien в переносимое приложение, C ++ - PullRequest
1 голос
/ 09 января 2012

Хорошо, я немного искал, но, похоже, не смог найти ответ или пример того, как этого добиться.

По сути, у меня есть приложение, разработанное для переносимости (созданное с использованием VC ++ в VS2010, но без MFC или управляемых компонентов, необработанный WinAPI). У меня есть Lua 5.2, встроенный в него и позволяющий пользователю писать скрипты внутри приложения. У меня есть несколько склеенных функций, которые доступны для скриптов Lua, которые обрабатывают различные вызовы WinAPI.

Однако я бы хотел, чтобы пользователь мог написать скрипт, который выглядит примерно так:

require[[Alien/alien]]

local mb = alien.User32.MessageBoxA
mb:types{ 'long', 'long', 'string', 'string', 'long' }
print(mb(0, "Hello World!", "Test", 64))

Я просто не могу найти способ сделать это. Я не хочу требовать от пользователя установки Lua для Windows и, в идеале, не должно быть core.dll и struct.dll от иностранца; Когда я пытался что-то сделать с этими DLL-файлами в ./alien/, он зависал в Lua5.1.dll, потому что у меня был установлен LuaForWindows, я удалил LFW, а затем он просто утверждает, что Lua5.1.dll отсутствует. У меня есть Lua 5.2, встроенная в мое приложение, поэтому очевидно, что библиотеки DLL core / struct из Alien Rock ожидают, что Lua5.1.dll будет в пути.

Я предпринял бесполезную попытку включить Alien src в проект, но, похоже, тоже не работает.

Любые идеи будут с благодарностью. Я бы предпочел, чтобы все это содержалось в моем приложении, но я остановлюсь на решении, которое включает в себя включение библиотек в мой проект для сборки и объединения в дистрибутив, если это единственная альтернатива.

Спасибо!

UPDATE:

Хорошо, спасибо, Бен Фойгт! Я думаю, что я почти там. Я загрузил core.c и struct.c и убедился, что все пути есть для libffi. Все компилируется без проблем, пока я не попытаюсь вызвать luaopen_alien_core в core.c (файл src alien.core), утверждая, что идентификатор не объявлен. Я попытался объявить сигнатуру функции в моем отдельном исходном файле, который пытается выполнить вызов, компиляция идет дальше, но не удается пожаловаться на неразрешенный внешний файл.

Очевидно, что это, вероятно, сейчас общая проблема C ++ (поскольку я только новичок в этой области). Вот общее представление о том, что у меня есть:

//core.c (from Alien project)

(...)

int luaopen_alien_core(lua_State *L) {
  alien_register_library_meta(L);
  alien_register_callback_meta(L);
  alien_register_function_meta(L);
  alien_register_buffer_meta(L);
  lua_getglobal(L, "alien");
  if(lua_isnil(L, -1)) {
    lua_newtable(L);
    lua_pushvalue(L, -1);
    lua_setglobal(L, "alien");
  }
  lua_newtable(L);
  lua_pushvalue(L, -1);
  lua_setfield(L, -3, "core");
  alien_register_main(L);
  return 1;
}

//mysource.c (the file attempting to call luaopen_alien_core(L))

void initLua()
{
    L = luaL_newstate();
    luaL_openlibs(L);
    luaopen_alien_core(L);
    (...)
}

Не удается начать компиляцию, выдав ошибку:

error C3861: 'luaopen_alien_core': identifier not found

Это имеет смысл, поэтому я добавляю следующую строку в myheader.h:

int luaopen_alien_core(lua_State *L);

Компилируется, но не может связаться с:

error LNK2001: unresolved external symbol "int __cdecl luaopen_alien_core(struct lua_State *)" (?luaopen_alien_core@@YAHPEAUlua_State@@@Z)

Я пробовал несколько вещей, о которых я могу думать, с моим ограниченным опытом, но ничто не удовлетворит эту ошибку. Я даже пытался переместить содержимое файла core.c в mysource.c, но это создает совершенно другой беспорядок и, похоже, является неправильным путем.

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

Еще раз спасибо! }

1 Ответ

1 голос
/ 09 января 2012

Я полагаю, что директива require загружает динамическую библиотеку и добавляет ее содержимое в активный движок Lua.

Связывая Alien непосредственно с вашим кодом, вы избавляете от необходимости динамической библиотеки. Но код перечисления содержимого не запустится, и вы не сможете использовать require для его запуска, иначе он будет искать файл DLL (вместе со всеми зависимостями DLL).

Итак, вы должны выяснить, какие функции вызывает директива require после загрузки DLL, и вызывать их при создании движка Lua. Тогда сценарию не нужно и не позволять запускаться с require [[Alien/alien]], но объекты Alien будут доступны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...