C++ 与 Lua交互,实现简单的C++ 与 Lua的简单调用,在控制台输出实现颜色的区分输出(一)

C++ 与 Lua交互,实现简单的C++ 与 Lua的简单调用,在控制台输出实现颜色的区分输出(一)

今天尝试配置 实现以下c++ 与 lua 的交互实现,准备工作:

lua.h, lauxlib.h, lualib.h ,  luaconf.h,  lua5.1.lib(五个文件要保证是同一版本的lua,如果安装了luaForWindows可以在安装目录找到这些文件,没有安装也可以自行下载lua编译生成)


VS创建项目luawithc++,将上面的除lua5.1.lib文件生育四个文件复制到与  .vcxproj文件相同目录即可

将lua5.1.lib文件添加到 附加依赖项。vs中右击工程文件-->属性-->配置属性-->链接器-->输入-->附加依赖项


创建main.cpp 测试编译一下是否能通过:

#include <iostream>

extern "C"
{
    #include "lua.h"//如果出现报错,无法找到文件,考虑文件位置放的不对
    #include "lauxlib.h"
    #include "lualib.h"
}

int main()
{
    //创建lua状态 相当于lua的栈
    lua_State *L = luaL_newstate();//提示无法解析的外部符号  考虑lua5.1.lib没有加到 附加依赖项
    if(L==NULL)
    {
        std::cout<<"error lua_State by luaL_newstate!"<<std::endl;
        return 0;
    }
    system("pause");
    return 0;
}

正常情况下  如果文件版本没问题  添加了  附加依赖项是可以正常编译通过的。继续下一步,创建一个要调用的lua文件 luaLogOut.lua

将lua文件放在debug目录下

print ("JJJKKK")

function logout(str,...)
    print(str)
end

很简单的一段测试代码,继续更新main.cpp

#include <iostream>

extern "C"
{
    #include "lua.h"//如果出现报错,无法找到文件,考虑文件位置放的不对
    #include "lauxlib.h"
    #include "lualib.h"
}

int main()
{
    //创建lua状态 相当于lua的栈
    lua_State *L = luaL_newstate();//提示无法解析的外部符号  考虑lua5.1.lib没有加到 附加依赖项
    if(L==NULL)
    {
        std::cout<<"error lua_State by luaL_newstate!"<<std::endl;
        return 0;
    }
    luaL_openlibs(L);//如果不加  会导致luaL_dofile出错
    //加载脚本  
    int nRet = luaL_dofile(L,"luaLogOut.lua");//注意上面5个文件的版本一致,否则有可能导致luaL_dofile找不到,另外还有luaL_loadfile可以自行百度看下区别
    if(nRet)
    {
        std::cout<<"error load file by luaL_dofile!"<<std::endl;
                lua_close(L);
                system("pause");
                return 0;
    }
    
    lua_getglobal(L,"logout");//获取lua脚本中的全局函数
    lua_pushstring(L,"I am lua function 'logout' tese");//要传入的参数  压入栈中  
    /*
    lua_pushcclosure(L, func, 0) // 创建并压入一个闭包
    lua_createtable(L, 0, 0)        // 新建并压入一个表
    lua_pushnumber(L, 343)      // 压入一个数字
    lua_pushstring(L, “mystr”)   // 压入一个字符串 
    */
    int nRet = lua_pcall(L,1,1,0);// 1 1 0 传入一个参数  返回一个参数  0自定义错误处理  注意与lua_call的区别
    if(nRet)
    {
      const char* result = lua_tostring(L,-1);
       std::cout<<"return msg: "<<result<<std::endl;
            lua_close(L);
            system("pause");
            return 0;
    }
    lua_close(L);
    system("pause");
    return 0;
}

配置没有出错的话会顺利的输出:

JJJKKK

I am lua function 'logout' test

至此简单的C++调用Lua的简单实现就完成了。

下一篇继续实现lua调用C++ 控制台输出颜色区分,在项目实际开发中使用效果还不错。