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
int
    printf("这个程序演示Lua调用C++的Dll:\n");  
lua_State
     luaL_openlibs(pLuaState);  
   
if (luaL_dofile(pLuaState, "maintest.lua"))
     {  
"dofile error.\n");  
     }  
 
     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 不认
 <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")

附上运行效果图:


支持lua调用的视频库 lua 调用 dll_支持lua调用的视频库