2024年Lua调用C的动态库,2024年最新字节跳动C C++架构师学习笔记

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

–测试模块
《module.lua文件》
module = {}
module.constant = “这是一个变量”
function module.func1()
io.write(“这是一个公有函数!\n”)
end
local function func2()
print(“这是一个私有函数”)
end

function module.func3()
func2()
end
return module
《main.lua文件》
local m = require(“module”) --> 别名
m.func1();
m.func3();
print(m.constant)

–测试元表的__index
print(“测试元表的__index”)
mytable = setmetatable({key1 = “value1”}, {__index = {key2 = “metatablevalue”}})
print(mytable.key1, mytable.key2)

–测试元表的相加
function table_maxn(t)
local mn = 0
for k, v in pairs(t) do
if mn < k then
mn = k
end
end
return mn
end
mytable = setmetatable({1, 2, 3}, {
__add = function(mytable, newtable)
for i = 1, table_maxn(newtable) do
table.insert(mytable, table_maxn(mytable)+1, newtable[i])
end
return mytable
end
})
secondtable = {4, 5, 6}
mytable = mytable + secondtable
for k, v in ipairs(mytable) do
print(k, v)
end


### 2、 C调用lua,执行lua脚本


复制lua源码到工程中或者引入lua的lib文件及头文件也可。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5d8b8d2d166b4b268c030c32ed55bc9c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAencxOTk2,size_20,color_FFFFFF,t_70,g_se,x_16)



#include <windows.h>

extern “C” {
#include “lua.h”
#include “lualib.h”
#include “lauxlib.h”
}

int main()
{
lua_State* l = luaL_newstate();
luaL_openlibs(l);
luaL_dofile(l, “main.lua”);
lua_close(l);
system(“pause”); //为了保证在windows资源管理器中打开main.exe不闪退。需要windows.h。
return 0;
}


### 3、lua调用C库


![在这里插入图片描述](https://img-blog.csdnimg.cn/dbca5672e44a403c9fc6d0c133ef9a76.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAencxOTk2,size_20,color_FFFFFF,t_70,g_se,x_16)  
 c工程



extern “C” {
#include “lua.h”
#include “lualib.h”
#include “lauxlib.h”
};
#include
#include
using namespace std;

int number = 0;
int number2 = 0;
int flag = 0;
std::thread *t1 = NULL;
std::thread *t2 = NULL;
void ThreadProc1()
{
flag = 1;
while (1)
{
cout << “thread 1 :” << number << endl;
++number;
this_thread::sleep_for(std::chrono::milliseconds(10));
}

return ;

}
void ThreadProc2()
{
while (number2 < 100)
{
cout << “thread 2 :” << number2 << endl;
++number2;
this_thread::sleep_for(std::chrono::milliseconds(10));
}

return ;

}

extern “C” int ShowMsg(lua_State* luaEnv) {
cout << “Hello world from clibs!” << endl;
t1 = new std::thread(ThreadProc1);
return 1; // 返回值个数为0个.
}
extern “C” int ShowMsg2(lua_State* luaEnv) {
cout << “Hello world from clibs222!” << endl;
t2 = new std::thread(ThreadProc2);

return 0; // 返回值个数为0个. 

}
// part one: 要导出的函数列表
static luaL_Reg luaLibs[] = {
{ “ShowMsg”, ShowMsg },
{ “ShowMsg2”, ShowMsg2 },
{ NULL, NULL }
};

// part two: DLL入口函数,Lua调用此DLL的入口函数.
//testDll是modole名, 将来require这个名字并且这个名称要与dll名称一致,并且不能与lua名称一致
extern “C” __declspec(dllexport)
int luaopen_testDll(lua_State* luaEnv) {
const char* const LIBRARY_NAME = “WinFeature”; //这里也写WinFeature
luaL_register(luaEnv, LIBRARY_NAME, luaLibs);//注册要导出的函数列表
return 1;
}


lua文件



–加载test库
WinFeature1 = require(“testDll”)

–定义协程
co = coroutine.create(
function()
WinFeature1.ShowMsg()
end
)

–激活协程
coroutine.resume(co)
–打印协程状态
print(coroutine.status(co))


### 4、lua无法调起C库中两个线程,以及lua端卡死问题或者lua端协程结束C也跟着结束


![在这里插入图片描述](https://img-blog.csdnimg.cn/4f1d92abdcc0409b919d961adc7b22c9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAencxOTk2,size_20,color_FFFFFF,t_70,g_se,x_16)  
 lua函数





![img](https://img-blog.csdnimg.cn/img_convert/e7b417e33c61ee9eb7914f5689580060.png)
![img](https://img-blog.csdnimg.cn/img_convert/58c9a49a7229f4182eafd66b31411ab2.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值