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控制台程序,选动态库,空项目,如图

lua 调用C++动态库_第1张图片

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

lua 调用C++动态库_第2张图片

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

lua 调用C++动态库_第3张图片

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

lua 调用C++动态库_第4张图片

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  
#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,应该会报错,大概如下lua 调用C++动态库_第5张图片

在解决方案下,选中此报错的文件,右键->属性->lua 调用C++动态库_第6张图片

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

10.生成的dll如图所示:

lua 调用C++动态库_第7张图片

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,如图

lua 调用C++动态库_第8张图片














你可能感兴趣的:(C,API(lua),lua)