C++调用lua脚本,包括全局函数绑定、类绑定,十分钟快速掌握

系列文章目录

lua调用C/C++的函数,十分钟快速掌握



摘要

在这个快节奏的技术博客中,我们将借助sol2库,以十分钟的时间快速掌握如何在C++中调用Lua脚本。sol2是一个轻量级的Lua绑定库,它简化了C++与Lua之间的交互,使得全局函数和类的绑定变得异常简便。我们将创建几个”复杂的“函数,变长参数、多返回值,和一个具有几个成员函数的简单类,通过sol2的简洁语法,只需几行代码,我们就能将C++函数绑定到Lua环境中,实现跨语言调用。

为了快速输出我们要讲的内容,我不仅提供了实际的示例代码,还将解释每一步的操作,确保能够迅速理解并运用这一技术。通过这十分钟的快速掌握,希望将能够在项目中充分发挥C++与Lua的优势,实现更灵活、高效的代码编写。无论是全局函数的调用还是类的绑定,sol2为C++与Lua的融合提供了一种极具便利性和效率的解决方案。

环境

工具\组件版本说明
Windows10
visual studio2022
lua5.4
sol23.2.3
C++17sol2需要

一些说明

本质上在C++与Lua的相互调用中它们的地位并不”平等“,要不是C++程序作为启动程序(主程),要不就是lua作为启动程序(主程)。lua作为启动程序使用C++代码只能通过动态库引用其实现的C风格函数,而C++程序作为启动程序中,使用lua脚本则是嵌入式的使用,有两种方式,1、直接在cpp里写lua代码,2、在cpp中引用外部lua脚本文件,这两种方式下可以在cpp中通过sol2这种绑定库将一些类、函数绑定到Lua中提供给内嵌的lua代码或者外部的lua脚本使用。本文我们主要介绍第二种方式。
像openResty、neovim也是这么用的。

使用步骤

lua头文件和静态链接库或者动态库,从官方网站下载预编译好的即可,当然如果你有自定义需求也可自行修改编译。

引入sol2头文件,从github上下载。

# 就是这三个文件,要按此层次结构放好。
│  sol.hpp
│
└─sol
        config.hpp
        forward.hpp

visual studio新建个项目,C++语言标准设置为C++17。

加入头文件和库文件到项目中。

接下来就是码代码了。


码代码

自定义函数

多返回值

通过使用sol2我们不需要自己再写包装方法,这一下就省了不少代码。

std::tuple<int,const char*, double> multipleResultFunc(int a, const char* b, double c)
{
	//return std::tuple<int, char*, double>(a, b, c);
	return std::make_tuple(a, b, c);
}

变长参数

int variaArgs(sol::variadic_args va)
{
	int r = 0;
	for (auto v : va)
	{
		r += static_cast<int>( v);
	}

	return r;
}

自定义类

	class my_class
	{
	private:
		std::string m_str;

	public:
		int b = 24;

		int f() const
		{
			return 24;
		}

		void g()
		{
			++b;
		}

		void setTitle(const char* str)
		{
			this->m_str = str;
		}

		void print()
		{
			std::cout << this->m_str << " , " << this->b << std::endl;
			std::wcout << this->rowname << L" , " << typeid( this->columns).name() << std::endl;
		}
	}
#define SOL_CHECK_ARGUMENTS 1
#include "sol.hpp"

	sol::state lua;
	lua.open_libraries(sol::lib::base);

	// "bark" namespacing in Lua
	// namespacing is just putting things in a table
	sol::table bark = lua.create_named_table("bark");
	bark.new_usertype<my_class>("my_class",
		"f", &my_class::f,
		"g", &my_class::g,
		"setTitle", &my_class::setTitle,
		"print", &my_class::print
		//,
		//"putUnsetValue", &my_class::putUnsetValue
		//,
		//"setSome", &my_class::setSome
		); // the usual

	lua.set_function("multipleResultFunc", multipleResultFunc);
	lua.set_function("variaArgs", variaArgs);

	// load and execute from file
	lua.script_file("test_sol2.lua");
	

test_sol2.lua内容

obj = bark.my_class.new()
obj:g()
local result =obj:f()
obj:setTitle("I am Tom , and you ?")
print(">>>>>>")
obj:print()

bark.print_my_class(obj)
print(result)

print(bark.add_two_number(1,2))

mr, mr2, mr3 = multipleResultFunc(11, "Jerry", 123.45)
print(mr, mr2, mr3)
print(mr)

print("call variable args function", 1, 2, 3, 4)
local r= variaArgs(1,2,3,4)
print(variaArgs, r)

程序输出

=== namespacing ===
I am Tom , and you ? , 25
 , class std::vector<unsigned long,class std::allocator<unsigned long> >
my_class { b: 25 }
24
3
11      Jerry   123.45
11
call variable args function     1       2       3       4
function: 0102B030      10
C source output Your name is Michael, and 2323 years old.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值