LUA呼び出しCコード
http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html
上記の文章に基づいて、いくつかの補足をします.
CコードをDLLファイルにコンパイルし、LUAコードを呼び出します.
VS 2012を例に、コンパイル中に発生した小さな問題解決方法を紹介します.
1、ヘッダファイルとライブラリリファレンスの設定:
上記の構成項目がLUAインストールディレクトリを指すinlucde、libサブディレクトリを設定します.
次にリンクライブラリ名を設定すると、正常にコンパイルできます.
2、CコードはDLLストレージパスに対応するLUAのデフォルト検索パスでない場合、どのように構成するか.
環境変数LUA経由CPATHは指定しますが、ファイル名を含むフルパスでなければなりません.
補足:LinuxでLUAからCコードを呼び出す方法
http://blog.csdn.net/wdlove58/article/details/52191248
私のところはlua 5です.1を例に
Ubuntu下Lua開発環境インストール:
ライブラリファイルのインストールパスを表示するには、次の手順に従います.
編集mytestlib.cファイル
コンパイル命令:
a.luaファイルの内容は以下の通りです.
a.luaの実行結果は次のとおりです.
上記の文章に基づいて、いくつかの補足をします.
CコードをDLLファイルにコンパイルし、LUAコードを呼び出します.
//mytestlib.cpp
#include
#include
#include
#include
#include
// C , 。
// , C , extern "C" 。
// , 。
extern "C" int add(lua_State* L)
{
double op1 = luaL_checknumber(L,1);
double op2 = luaL_checknumber(L,2);
lua_pushnumber(L,op1 + op2);
return 1;
}
extern "C" int sub(lua_State* L)
{
double op1 = luaL_checknumber(L,1);
double op2 = luaL_checknumber(L,2);
lua_pushnumber(L,op1 - op2);
return 1;
}
//luaL_Reg , Lua 。
// C 。
// NULL, Lua 。
static luaL_Reg mylibs[] = {
{"add", add},
{"sub", sub},
{NULL, NULL}
};
// C 。 。 :
//1. 。
//2. luaopen_xxx, xxx library 。Lua require "xxx" 。
//3. luaL_register , "xxx", 。
//4. , "xxx" , C Lua, , Lua ,
// 。
extern "C" __declspec(dllexport)
int luaopen_mytestlib(lua_State* L)
{
const char* libName = "mytestlib";
luaL_register(L,libName,mylibs);
return 1;
}
VS 2012を例に、コンパイル中に発生した小さな問題解決方法を紹介します.
1、ヘッダファイルとライブラリリファレンスの設定:
上記の構成項目がLUAインストールディレクトリを指すinlucde、libサブディレクトリを設定します.
次にリンクライブラリ名を設定すると、正常にコンパイルできます.
2、CコードはDLLストレージパスに対応するLUAのデフォルト検索パスでない場合、どのように構成するか.
環境変数LUA経由CPATHは指定しますが、ファイル名を含むフルパスでなければなりません.
補足:LinuxでLUAからCコードを呼び出す方法
http://blog.csdn.net/wdlove58/article/details/52191248
私のところはlua 5です.1を例に
Ubuntu下Lua開発環境インストール:
// lua
sudo apt-get install lua
sudo apt-get install lua5.1-0-dev
ライブラリファイルのインストールパスを表示するには、次の手順に従います.
locate liblua
編集mytestlib.cファイル
#include
#include
#include
#include
int add(lua_State* L) // extern "C",
{
double op1 = luaL_checknumber(L, 1);
double op2 = luaL_checknumber(L, 2);
lua_pushnumber(L, op1 + op2);
return 1;
}
int sub(lua_State* L)
{
double op1 = luaL_checknumber(L, 1);
double op2 = luaL_checknumber(L, 2);
lua_pushnumber(L, op1 - op2);
return 1;
}
//luaL_Reg , Lua 。
// C 。
// NULL, Lua 。
static luaL_Reg mylibs[] ={
{"add", add},
{"sub", sub},
{NULL, NULL}
};
// C 。 。 :
//1. 。
//2. luaopen_xxx, xxx library 。Lua require "xxx" 。
//3. luaL_setfuncs , 。
//4. , "xxx" , C Lua, , Lua ,
// 。
int luaopen_mytestlib(lua_State* L)
{
const char* libName = "mytestlib";
luaL_register(L, libName, mylibs);
// lua-5.3 luaL_register ,
//lua_newtable(L);
//luaL_setfuncs(L, mylibs, 0);
return 1;
}
コンパイル命令:
gcc mytestlib.c -fPIC -shared -I/usr/include/lua5.1/ -L/usr/lib/x86_64-linux-gnu/ -llua5.1 -o mytestlib.so -Wall
a.luaファイルの内容は以下の通りです.
local mylib = require("mytestlib") -- teste.c
print(mylib.add(1.0,2.0))
print(mylib.sub(20.1,19))
a.luaの実行結果は次のとおりです.
xxxx@ubuntu:~/work_space/lua_call_c$ lua a.lua
3
1.1