Использование Lua для вызова C (в Linux) - PullRequest
0 голосов
/ 20 декабря 2018

Я создал программу на C и написал следующие две функции:

1. int c_add(lua_State* L)  
   {...some code here...  
   }  
2. int main(int argc, char* argv)  
   {...some code here...  
   lua_register(L, "c_add", c_add);  
   }  

И скомпилировал ее, успешно выполнив следующую команду.

gcc -o test.exe test.c -I /home/ec2-user/install/lua-5.1.5/src -llua-5.1

Но следующая ошибка появилась после использования программы lua для ее вызова.

lua: func2.lua:2: attempt to call global 'c_add' (a nil value)  

Как решить эту проблему? `

1 Ответ

0 голосов
/ 20 декабря 2018

Вам необходимо скомпилировать код в виде разделяемой библиотеки, чтобы получить доступ к функциям C из внешнего экземпляра Lua.Вам не нужна функция main, и вы передаете флаг -shared в gcc.Затем вам нужно сообщить Lua, что делать, когда вызывается require, путем реализации следующей функции:

//             same name as the so/dll
//                      v
LUALIB_API int luaopen_test(lua_State *L) {
    lua_register(L, "c_add", c_add);
    return 0;
}

Это создает одну глобальную функцию.Лучше зарегистрировать массив luaL_Reg функций с помощью luaL_register:

static const luaL_Reg function_list[] = {
    {"c_add",   c_add},
    {NULL, NULL}
};

LUALIB_API int luaopen_test(lua_State *L) {
    luaL_register(L, "test", function_list);
    return 1;
}

, чтобы таблица функций возвращалась require:

local my_c_functions = require("test")
print(my_c_functions.c_add(42, 42))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...