在lua5.2.3的环境下,vs2012生成c的dll程序块供lua调用

lua是一种脚本,它的存在是辅助项目,所以合理的理解应该是一个解决方案包含一个c++主程序,c程序块,和 lua脚本。主程序调用lua,lua调用c程序块,这里的理解就是DLL。这样我们可以把逻辑之间合理的分开。以后更新打增量包就可以了。

好了,切入正题:如何用vs2012生成dll文件。

vs2012 生成一个工程即一个解决方案,在解决方案里添加 新建 win32 console 工程,选为 static lib,不加头文件。  

1.

将lua 5.2.3 -》src 里的代码 拖到 工程下,再加载到 工程的 source 里。

选中工程,右击 选项,在配置里面找到 c/c++ -》所有选项 -》compiled as  选择 c[这是编译方式]

选中工程,右击 build ,即可在解决方案的 Debug 文件夹生成  lib文件。

这就生成了,lua的静态库,想要用lua ,加载这个静态库就可以了。


2.

新建c++主程序,一样 win32 console 工程,选为空工程, 在工程source 里添加 新建 cpp 文件。

 #include <stdio.h>

#include <lua.hpp>

#include <string.h>  


void main(){

    int global_var1 = 0;  

    printf("这个程序演示Lua调用C++的Dll:\n");  

    lua_State *pLuaState = luaL_newstate(); 

    luaL_openlibs(pLuaState);  

  

    if (luaL_dofile(pLuaState, "maintest.lua"))

    {  

        printf("dofile error.\n");  

    }  

    getchar();   

    lua_close(pLuaState);  

}

右击工程选项,c/c++ -》general 里面添加 要加载的 静态库的源文件目录,可以是lua5.2.3的src 路径,也可以是我们刚才拷贝到的那个工程目录。

顺便的,找到 linker -》general 里面添加,要加载的静态库 的目录 ,当前就是现在的这个解决方案的 debug 路径。

       继续在linker中找到 input ,在里面的 另外添加依赖选项里,加入静态库的名字。 例如: lua.lib

把lua文件拖到工程目录下,因为我这代码里 是当前位置,没写绝对路径

右击 build , 然后选中解决方案,运行。 lua 要能跑起来,再下一步,不然就再调试。


3.

同1,新建工程,选择Dll,确定。添加代码文件 

#include <stdio.h>

#define LUA_LIB// <------- here   这个要的,不然 LUALIB_API 不认

#include <lua.h>

#include <lualib.h>

#include <lauxlib.h>


static int HelloFun(lua_State *L){

printf("HelloWorld");

return 0;

}


static int HaHa(lua_State *L){

printf("HaHa");

return 0;

}


LUALIB_API int luaopen_dllforLua(lua_State *L) // luaopen 是lua 的dll 要加的,当你require的时候,默认调用了这个方法[已在require里实现,是自动的]

{

printf("Hello__1\n");

//luaL_newlib(L, mylib);                                                  

//luaL_register(L,"ss",mylib);

lua_register(L, "HelloFun", HelloFun);

return 1;

}

//static const struct luaL_Reg mylib[] =

//{

// {"HelloFun",HelloFun},

// {"HaHa",HaHa},

// {NULL,NULL}

//};


我想多个函数一起注册的,一直没用,老方法,新方法都试着调用过,最后无奈,编译没问题,就是总是dofile error,最后选择就注册一个。打算先跑起来。

我luaopen的代码里加了个printf,就是看,是否成功进入了 dll。一样的,这些函数要依赖 lua的静态库,所以同第二步的3个步骤,include path,lib path,input name。

最后,因为要声称lua能识别的dll,所以需要 右击 选项 c/c++ ->预编译头 里添加 LUA_BUILD_AS_DLL ,从字面看也很容易理解不是吗。

ok了,右击build,在 lua里添加 require 命令,获取 dll文件。

选中主工程,点运行,如果 输出了,你在dll 的 luaopen 里添加的 printf 了,说明dll 成功加载了,然后你就可以安心修改lua脚本,调用dll函数了。

至此也就完成了。

附上 lua 代码:

print("hello")

mld = require"dllforLua"

print(mld.."")

HelloFun()

print("hello2")


附上运行效果图:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值