Вызов C ++ из скрипта Lua

Я пытаюсь связать Lua в своих приложениях, теперь я пытаюсь проверить, как связать Lua с C ++. Моя проблема очень странная, потому что я хочу вызвать функцию main() из скрипта при запуске, после luaL_loadfile, Мой код:

#include <iostream>
#include <cstdlib>
#include <stdio.h>

#include "lua.hpp"#include "lauxlib.h"#include "lualib.h"
using namespace std;

int main(int argc, char **argv) {
lua_State* lua = luaL_newstate();
luaL_openlibs(lua);

if (luaL_loadfile(lua, "test.lua") != 0) {
std::cout << lua_tostring(lua, -1) << "\n";
lua_pop(lua, 1);
return 1;
}

lua_getfield(lua, LUA_REGISTRYINDEX, "main");
if (lua_pcall(lua, 0, 1, 0) != 0) {
printf("Error running function 'main': %s\n", lua_tostring(lua, -1));
return 1;
}

lua_close(lua);

return 0;
}

и мой вывод:

Ошибка при запуске функции ‘main’: попытка вызвать нулевое значение

1

Решение

Я собрал пример встраивания lua 5.2 в консольный проект Visual Studio 2005 в этой статье с источником, Расширение приложения C ++ с Lua 5.2.

На самом деле не имеет смысла вызывать main () из вашего lua-скрипта, так как main () является точкой входа для вашего приложения, и есть вещи инициализации Lua, которые вам нужно сделать, и сделать это только один раз.

Пример и статья, которую я собрал, показывают использование Lua 5.2 с C ++ и возможность вызова функций C, которые вы создаете из своего сценария Lua. В примере также показан вызов функций Lua из программы на C ++.

Я сделал это около года назад, используя Visual Studio 2005. Я подозреваю, что переход с Visual Studio 2005 на 2012 будет простым. Я не уверен, насколько просто было бы портировать на другой компилятор и среду разработки. Как минимум, функцию _tmain (), используемую с консольным приложением Windows в Visual Studio 2005, необходимо переименовать в main ().

2

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

Пытаться luaL_dofile вместо luaL_loadfile,

Это одна из самых частых ошибок: luaL_loadfile загружает файл, но не запускает его; он просто оставляет в стеке функцию, представляющую загруженный файл, готовый к вызову. Функция main будет определяться только при запуске сценария, то есть при вызове функции сценария. Сообщение об ошибке пытается сказать вам об этом. (Я предполагаю, что ваш скрипт определяет функцию с именем main, В этом нет особой необходимости, но это безвредно.)

2

По вопросам рекламы [email protected]