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}
//};
我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")
附上运行效果图: