在Lua的源码linit.c中增加如下代码
static int showRlt1(lua_State* L);
static int showRlt2(lua_State* L);
// 另一种注册方式
static const luaL_Reg mylibs[] = {
{"showRlt1",showRlt1},
{"showRlt2",showRlt2},
{NULL,NULL}
};
int showRlt1(lua_State* L){
lua_pushstring(L, "c function showRlt1");
return 1;
}
int showRlt2(lua_State* L){
const char* value = luaL_checkstring(L, -1);
lua_pushstring(L, value);
return 1;
}
int luaopen_mylib(lua_State* L){
luaL_newlib(L, mylibs);
return 1;
}
/*
** these libs are loaded by lua.c and are readily available to any Lua
** program
*/
static const luaL_Reg loadedlibs[] = {
{"_G", luaopen_base},
{LUA_LOADLIBNAME, luaopen_package},
{LUA_COLIBNAME, luaopen_coroutine},
{LUA_TABLIBNAME, luaopen_table},
{LUA_IOLIBNAME, luaopen_io},
{LUA_OSLIBNAME, luaopen_os},
{LUA_STRLIBNAME, luaopen_string},
{LUA_BITLIBNAME, luaopen_bit32},
{LUA_MATHLIBNAME, luaopen_math},
{LUA_DBLIBNAME, luaopen_debug},
{"mylib",luaopen_mylib},
{NULL, NULL}
};
即可在Lua中使用showRlt1和showRlt2两个C函数
//
// main.cpp
// LuaAndCpp
//
// Created by Forest on 16/6/27.
// Copyright (c) 2016年 lin. All rights reserved.
//
#include <iostream>
#include "lua.hpp"
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
lua_State* m_luaState = luaL_newstate();
luaL_openlibs(m_luaState);
luaL_dofile(m_luaState, "/Users/Forest/Documents/LuaAndCpp/LuaAndCpp/scripts/config.lua");
lua_close(m_luaState);
return 0;
}
config.lua
local mylib = require('mylib')
print('---->>',mylib)
print('---->>',mylib.showRlt1())
print('---->>',mylib.showRlt2('APPLE'))
运行结果:
Hello, World!
---->> table: 0x100306260
---->> c function showRlt1
---->> APPLE
Program ended with exit code: 0