lua调用C/C++的函数,十分钟快速掌握
在这个快节奏的技术博客中,我们将借助sol2库,以十分钟的时间快速掌握如何在C++中调用Lua脚本。sol2是一个轻量级的Lua绑定库,它简化了C++与Lua之间的交互,使得全局函数和类的绑定变得异常简便。我们将创建几个”复杂的“函数,变长参数、多返回值,和一个具有几个成员函数的简单类,通过sol2的简洁语法,只需几行代码,我们就能将C++函数绑定到Lua环境中,实现跨语言调用。
为了快速输出我们要讲的内容,我不仅提供了实际的示例代码,还将解释每一步的操作,确保能够迅速理解并运用这一技术。通过这十分钟的快速掌握,希望将能够在项目中充分发挥C++与Lua的优势,实现更灵活、高效的代码编写。无论是全局函数的调用还是类的绑定,sol2为C++与Lua的融合提供了一种极具便利性和效率的解决方案。
工具\组件 | 版本 | 说明 |
---|---|---|
Windows | 10 | |
visual studio | 2022 | |
lua | 5.4 | |
sol2 | 3.2.3 | |
C++ | 17 | sol2需要 |
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(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");
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.