lua 调用C++动态库

一.生成动态库dll:

1.去官网下载http://www.lua.org/versions.htm,下载lua5.1.5版本,lua5.2以后的有些函数时有改动的

2.下载后解压到一个文件夹中比如lua-5.1.5(本文安装的是lua5.1)

3.VS2015新建一个win32控制台程序,选动态库,空项目,如图


4.新建好工程后,把lua-5.1.5文件夹中的src文件夹拷贝进工程目录,如图所示


5.在解决方案里点击头文件,右键,添加->现有项,把src文件夹中的.h文件全部添加进来如图:


6.同理5步添加源文件,把src里的.c文件除了lua.c和luac.c两个文件不要添加进来,别的文件全部添加进来,如图


7.按Ctrl+Shift+A弹出对话框,分别添加MyDll.h和MyDll.cpp两个文件。分别添加代码

MyDll.h中添加:

#pragma once  
extern "C" {
#include "../src/lua.h"  //指定正确的路径
#include "../src/lualib.h"  
#include "../src/lauxlib.h"  
}


#ifdef LUA_EXPORTS  
#define LUA_API __declspec(dllexport)  
#else  
#define LUA_API __declspec(dllimport)  
#endif  


extern "C" LUA_API int luaopen_MyDll(lua_State *L);//定义导出函数


MyDll.cpp中添加代码:

#include <stdio.h>  
#include "MyDll.h"  
static int averageFunc(lua_State *L)
{
int n = lua_gettop(L);
double sum = 0;
int i;


/* 循环求参数之和 */
for (i = 1; i <= n; i++)
sum += lua_tonumber(L, i);


lua_pushnumber(L, sum / n);     //压入平均值  
lua_pushnumber(L, sum);         //压入和  


return 2;                       //返回两个结果  
}


static int sayHelloFunc(lua_State* L)
{
printf("hello world!");
return 0;
}


static const struct luaL_Reg myLib[] =
{
{ "average", averageFunc },
{ "sayHello", sayHelloFunc },
{ NULL, NULL }       //数组中最后一对必须是{NULL, NULL},用来表示结束      
};


int luaopen_MyDll(lua_State *L)
{
luaL_register(L, "ss", myLib);
return 1;       // 把myLib表压入了栈中,所以就需要返回1  
}

8.解决方案配置选择Release

9.按Ctrl+Shift+B键,生成解决方案,

如果是VS2015,应该会报错,大概如下

在解决方案下,选中此报错的文件,右键->属性->

添加_CRT_SECURE_NO_WARNINGS,就不会报错了。所有的文件都如此修改属性,直到正确生成dll文件为止

10.生成的dll如图所示:


11.随便在一个地方建个文件夹,把Mydll.dll拷贝进此文件夹中。在此文件夹中新建一个main.lua文件,输入代码:

require "MyDll"  
local ave,sum = ss.average(1,2,3,4,5)--参数对应堆栈中的数据  
print(ave,sum)  -- 3 15  
ss.sayHello()   -- hello world!

11.命令行运行输入 lua main.lua,如图















  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值