LUA呼び出しCコード

4769 ワード

http://www.cnblogs.com/stephen-liu74/archive/2012/07/23/2469902.html
上記の文章に基づいて、いくつかの補足をします.
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调用C代码_第1张图片
上記の構成項目がLUAインストールディレクトリを指すinlucde、libサブディレクトリを設定します.
LUA调用C代码_第2张图片
次にリンクライブラリ名を設定すると、正常にコンパイルできます.
2、CコードはDLLストレージパスに対応するLUAのデフォルト検索パスでない場合、どのように構成するか.
LUA调用C代码_第3张图片
環境変数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