一.生成动态库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,如图