如何用C/C++生成一个为lua所用的动态库dll文件以及lua如何调用该dll(C语言的动态库)

如果读者朋友想详细的了解lua与C的通信原理,请移步这里【https://www.zhangshengrong.com/p/ERNnAzWa5W/】;

先说两句废话:怪不得lua不火,因为它对我们新手太不友好了。比如生成一个为lua调用dll的文件这么简单的小事,昨天我按照网上给出的教程总是出错(而且网上关于这方面的资料少的可怜!),最后还是通过自己的不断尝试修成正果,所以还是在这儿写博便记,下面进入正题。

首先是下载一个lua源码包,这里我选择的是lua5.1.5(本来我用的是lua-5.4,但是遇到了各种坑,编译的,运行的等等),朋友们可以去这里下载【https://mp.csdn.net/console/upDetailed】,解压缩之后,把它随便弄到一个地方。

其次,使用VS创建一个动态库项目,具体步骤,打开VS-》创建新项目-》选择window桌面向导,然后给项目命名(不要瞎起名,因为这决定您生成的dll名字),我这里给项目的命名是【MyLuaDll】,记住这个名字!

然后,点击创建,VS会弹出一个【window桌面向导】对话框,这里一定要把应用程序类型改成【动态链接库(.dll)】,最好把下面的【空项目】也勾选上,之后点击确定,项目就创建完成了,记住这个项目创建的路径。

接着,去到我们解压缩后的lua-5.1.5文件夹下的【src】文件夹下,复制里面所有的文件(注意,除了【lua.c】和【luac.c】,这两个文件不要复制!),然后来到我们刚才创建的【MyLuaDll】项目根目录下,把方才复制的所有文件直接粘贴进来。

再接着,打开VS,鼠标右键点击我们的项目,选择【添加】-》【现有项】,点击后弹出一个对话框,在对话框里找到我们的项目根目录,然后选择刚才粘贴进去的所有文件,如下图所示:

完成上面的步骤之后,我们还需要添加一个自定义的cpp文件,鼠标右键项目然后添加新文件,文件名随便取,我选择的是【abcd.cpp】,把它添加到项目里之后,就可以在它上面书写源代码了,我的源代码内容如下:

#include <iostream>
#include <windows.h>
extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

extern "C" int func1(lua_State* luaEnv) // 这里可以这样写,也可以写成static
{
	std::cout << "welcome to C world,first at all,allow me to sleep for 3 second." << std::endl;
	Sleep(3000);
	std::cout << "i am dll, now i wake up!" << std::endl;
	return 0;
}
static int func2(lua_State* luaEnv)//在lua中,调用这个函数时,需要传入两个number类型值
{
	auto  op1 = luaL_checknumber(luaEnv, 1);//检查栈顶的元素是不是number类型,然后赋值给op1
	auto  op2 = luaL_checknumber(luaEnv, 2);
	lua_pushnumber(luaEnv, op1+op2); //计算op1+op2的结果值,然后压入lua栈顶(返回给lua)
	lua_pushstring(luaEnv, "i am dll of C,my work is done, goodbye!"); //再返回给lua一个字符串
	return 2; //这句代码作用是告诉lua"本函数要返回给你几个东西",比如上面返回了一个数值和一个字符串,所以这里应该返回2
}

static luaL_Reg mylibs[]  //我们需要弄一个表,而表中的内容就是我们需要导出的这个文件里的函数
=
{
	{"aaa", func1}, //第一项可以随便取名,但要记住,因为在lua中调用这个函数时,用到的就是我们这里取的名字
	{"bbb", func2},
	{NULL , NULL}   //最后不要忘了用null收尾
};

extern "C" __declspec(dllexport) //下面函数的作用是定义一个module名,以备在lua中require
int luaopen_MyLuaDll(lua_State* luaEnv) //请注意!这句代码中“luaopen_”后面的“MyLuaDll”,不能乱取名,一定要与您的dll名字一致!
{
	/***很重要的一句代码,2参是字符串,内容一定要与上面的luaopen_后面的内容或者说我们的dll名字一致!最后的参数就是我们需要导出的表***/
	luaL_register(luaEnv, "MyLuaDll", mylibs);
	return 1;
}

代码写好之后,点击项目的生成按钮生成文件,不出意外的话VS会报错,大概如下图:

没关系,我们慢慢来【不用设置安全检查为否啥的,因为我试了,在我机器上没用,还是报错】,那么如何解决上面的错误呢,方法很简单,首先双击错误提示最上面的那句话,然后VS会打开对应的文件,在该文件的最上面添加一句代码【#pragma warning(disable : 4996)】,如下图:

完成之后,重新生成一下,不出意外还会报错(但报错的数量比上次要少几个),没关系,重复上一次的步骤:双击某行报错提示,进入对应文件,在文件代码的上面添加【#pragma warning(disable:4996)】,然后再重新生成一下,再报错,再添加,如此重复,报错会不断减少,一直到最后,总有一刻我们会真的生成了dll文件【应该是在项目的debug目录下】

然后,让我们随便在某个地方创建一个lua文件,我这里是在桌面上创建的【test.lua】,内容如下:

local obj = require("MyLuaDll")
print("welcome to lua!")
obj.aaa();
print("now come back lua")
local n, s = obj.bbb(33,66)
print('now in lua,this is last words of C dll: "'..s..'"')
print("dll return value is:",n)

最后,我们去我们刚才的项目里的debug文件夹下,找出我们生成的【MyLuaDll.dll】文件,复制它,然后回到刚才创建的lua文件的同目录下,把【MyLuaDll.dll】文件拷贝进来,运行lua文件,就可以看到我们dll工作的样子的,我的如下图:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值