Call C++ from Lua

Asked

Viewed 689 times

4

I wonder if there is a way to make a moon extension with a C++ blibioteca, ie the script moon access functions in C++.

Ex: add.lua file

-- add two numbers

function add ( x, y )

    CHAMAR AQUI uma função de uma biblioteca C++!

    return x + y

end

Grateful.

  • 1

    See if that help you.

  • That’s right!!! today I use Javascript with C++, but for what I see, I can change to Lua... thanks.

  • 4

    @It seems your appointment helped the AP. Why don’t you create an answer that might be useful to someone who directly accesses this site? If you do, you get my +1 (just let me know as soon as you post!). :)

1 answer

1

First in your C or C++ code you must declare this function with the specific syntax for integration with LUA.

The header "lua. h" defines the prototype lua_CFunction this way:

typedef int (*lua_CFunction) (lua_State *L);

That is, you must declare your function with integer type return (int) and it takes a single parameter, a pointer to the lua_State structure.

We will take as an example a function to print a message:

void escrever_mensagem(const char* mensagem)
{
    std::cout << mensagem << std::endl;
}

In order for this function to be accessible by LUA we must implement an interface to the function specified just above as follows:

int escrever_mensagem_lua(lua_State* lua_ptr)
{
    //Obtém o último argumento diretamente da pilha (stack) e
    // o converte para o tipo string (const char*)
    const char* mensagem = lua_tostring(lua_ptr, 1);

    //Faz a chamada para a função previamente declarada
    escrever_mensagem(mensagem);

    //Retorno 0 indica que a função foi executada com sucesso.
    return 0;
}

Once this is done it is necessary to expose the interface we created to the LUA code, as follows:

//Inicia o interpretador LUA em um novo estado.
lua_State* lua_ptr = luaL_newstate();

//Carrega as bibliotecas padrão de LUA
luaL_openlibs(lua_ptr);

//Considerando um script chamado "funcao_em_c.lua"
if (luaL_loadfile(lua_ptr, "funcao_em_c.lua")) 
{
    std::cerr << "Falha ao carregar o script!";
}

//Expoe a interface "escrever_mensagem_lua" declarada em C para o script LUA
lua_pushcfunction(lua_ptr, escrever_mensagem_lua);

//Define o nome pelo qual a interface será chamada em LUA para invocar a função
lua_setglobal(lua_ptr, "escrever_mensagem");

//Executa o script "funcao_em_c.lua"
lua_pcall(lua_ptr, 0, 0, 0);

Below follows code from the script "funcao_em_c.lua"

escrever_mensagem("Olá, mundo!")
escrever_mensagem("Posso concatenar strings com números:")
escrever_mensagem("Teste " .. 1)
escrever_mensagem("Posso efetuar cálculos:")
escrever_mensagem("Teste " .. 1 + 1)

Ready, now you can utilize most of the advantages of LUA combined with the power of C or C++.

Note: This answer is an adaptation and simplification of the content present in this link in English.

All rights are reserved to the author of the original code.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.