C++学习(五):SOL2库的使用

一、简单了解sol2

  • Sol2简介

    Sol是一个用于C+绑定Lua脚本的库,仅由头文件组成,方便集成,并提供了大量易用的API接口,可以便利地将Lua脚本与C+代码绑定起来,而不必去关心如何使用那些晦涩的Lua C API。正如其作者所言,Sol的目的就是提供极其简洁的API,并能高效到与C语言媲美,极大地来方便人们使用。

  • 编译条件

    Sol支持Lua的绝大多数版本,包括 5.1、5.2、5.3和LuaJit等,但由于代码中用到了许多C+11/14特性,因此编译时需要编译器支持C14标准甚至C+17标准

  • 安装方法

    去 https://github.com/ThePhD/sol2 下载一个sol.hpp , 然后放到 /usr/local/include 里即可,已经在100服务器上面部署好了环境,sol.hpp在/usr/local/include目录下。

  • 为什么强大

    只需要包含一个sol.hpp头文件即可(集成性很高,可能根据不同lua脚本需要一些简单的依赖)不需要任何其他的东西, 没有什么静态库/动态库之类的东西,也不需要像tolua++一样那么麻烦每个类都要写pkg文件。只需要稍微学习一下Sol2的导出API即可。

  • 使用方法

    在代码里面通过sol的接口把需要运行的 lua 脚本加载进去,生成对应的c+接口, 然后c的代码就可以直接调用这些lua生成的 c+ 接口,实现了c++直接调用 lua。接口导出是一个动态导出,如果有多个对象需要执行多个lua,则需要再全局变量中首先进行初始化,方便调用lua。

 

二、当前版本及配置

  • sol2版本和gcc版本:

    sol为当前最新版:Sol3 (sol2 v3.0)
    gcc版本:5.4.0
    (PS:需要支持C++14特性,sol中的很多代码都是根据c++14特性进行编写的,C++17不是必要条件)
     
  • 服务器及头文件存放路径:

    服务器为10.0.53.100,头文件存放路径为:/usr/local/include
     
  • 主要文件及作用:

    sol.hpp,对lua脚本的操作及使用。
     
  • 其它依赖文件及作用:

      依赖文件 作用
    1 forward.hpp 处理数字和一些特殊类型
    2 assert.hpp assert作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行
    3 tuple.hpp 增加lua_table和lua_value抽象
    4 lua_table.hpp 类似于tuple.hpp
    5 lua_value.hpp 完整全面的测试

    (PS:这些依赖文件需要根据sol调用lua脚本使用的一些方法去自行添加,不一定都要添加)
    (PS:这些依赖文件都可以在git中的include/sol中找到)

     

三、sol库的使用

  • 代码路径:

    测试用例后续会更新,暂时先把用例类型写一下

    测试用例 主要作用 需要调用的lua脚本
    easy.cpp sol对lua的简单调用 无,直接在c++中写lua语言
    variable_read.cpp sol读取lua脚本中的变量 variables.lua,里面简单存放了一个table
    variable_write.cpp sol向lua中写入变量 无,直接在c++中写lua脚本语言,也可以调用lua脚本
    register_c++.cpp c++函数通过sol注册到lua 无,直接在c++中写lua脚本语言,也可以调用lua脚本
    json_table.cpp json_str和table格式的相互转换 1.LuaJson.lua table和json_str格式转化模块 2.test.lua 对LuaJson.lua进行调用

    后续用例还会继续补充。

     

  • 执行方式:

    有一个可执行文件run.sh,如果需要执行的测试用例为XXX.cpp

    执行指令为: ./run.sh XXX.cpp

    执行完指令后,会生成可执行文件a.out,执行a.out可以查看执行结果。

     

  • 需要的库:

    之前发现sol不支持lua脚本中的require,会在编译完成运行的时候报 attempt to call global 'require' (a nil value),单独运行lua脚本却没有这个问题,可以正常调用。后研究发现,sol对lua的调用也存在一定的限制,比如说type,无法对其进行直接调用,需要在代码中补充sol的各种支持lua语言的库,比如最基础的base库。

    在sol调用lua的过程中,需要根据lua脚本中的代码,打开lua提供的各种库,下面是对一些库的简单介绍:

    简单介绍
    sol::lib::base 支持lua脚本中的一些基础函数,比如type,require
    sol::lib::string 支持lua脚本中的string函数操作
    sol::lib::package 支持lua脚本中的package函数,如制定lua脚本的路径
    sol::lib::table 支持lua脚本中的table的相关函数

     

    (PS:这些库都包含在sol::lib的枚举中,可以在一行代码指定多个库)

你可能感兴趣的:(C++)