VS 2012下调用Lua接口

本文介绍了一种在C++环境下调用Lua库时遇到的编译错误,并给出了具体的解决方案。通过对比C和C++的不同,指出了使用正确的头文件是解决问题的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一篇文章介绍了如何在VS 2012下编译Lua源码,现在来做个小小的C++代码测试!


参考《Lua程序设计》一书写的一个小例子:

#include <stdio.h>
#include <string.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

int main()
{
    char szBuffer[256];
    int nError = 0;
    lua_State* pLuaState = luaL_newstate(); //打开Lua
    luaL_openlibs(pLuaState); /* 打开标准库 */

    while (fgets(szBuffer, sizeof(szBuffer), stdin) != NULL)
    {
        nError = luaL_loadbuffer(pLuaState, szBuffer, strlen(szBuffer), "line") ||
            lua_pcall(pLuaState, 0, 0, 0); /* 如果出错,会将错误信息压入栈 */

        if (nError)
        {
            fprintf(stderr, "%s", lua_tostring(pLuaState, -1));
            lua_pop(pLuaState, 1); /* 从栈中弹出错误信息 */
        }
    }

    lua_close(pLuaState);
    return 0;
}

在配置好头文件及库文件目录,以及添加Lua.lib库引用之后,编译,很不幸没有编译成功,错误信息如下:

1>  luatest.cpp
1>luatest.obj : error LNK2019: 无法解析的外部符号 "void __cdecl lua_close(struct lua_State *)" (?lua_close@@YAXPAUlua_State@@@Z),该符号在函数 _main 中被引用
1>luatest.obj : error LNK2019: 无法解析的外部符号 "void __cdecl lua_settop(struct lua_State *,int)" (?lua_settop@@YAXPAUlua_State@@H@Z),该符号在函数 _main 中被引用
1>luatest.obj : error LNK2019: 无法解析的外部符号 "char const * __cdecl lua_tolstring(struct lua_State *,int,unsigned int *)" (?lua_tolstring@@YAPBDPAUlua_State@@HPAI@Z),该符号在函数 _main 中被引用
1>luatest.obj : error LNK2019: 无法解析的外部符号 "int __cdecl lua_pcallk(struct lua_State *,int,int,int,int,int (__cdecl*)(struct lua_State *))" (?lua_pcallk@@YAHPAUlua_State@@HHHHP6AH0@Z@Z),该符号在函数 _main 中被引用
1>luatest.obj : error LNK2019: 无法解析的外部符号 "int __cdecl luaL_loadbufferx(struct lua_State *,char const *,unsigned int,char const *,char const *)" (?luaL_loadbufferx@@YAHPAUlua_State@@PBDI11@Z),该符号在函数 _main 中被引用
1>luatest.obj : error LNK2019: 无法解析的外部符号 "struct lua_State * __cdecl luaL_newstate(void)" (?luaL_newstate@@YAPAUlua_State@@XZ),该符号在函数 _main 中被引用
1>luatest.obj : error LNK2019: 无法解析的外部符号 "void __cdecl luaL_openlibs(struct lua_State *)" (?luaL_openlibs@@YAXPAUlua_State@@@Z),该符号在函数 _main 中被引用
1>F:\Test\Lua\LuaTest\Debug\LuaTest.exe : fatal error LNK1120: 7 个无法解析的外部命令

根据经验,这个肯定是库的问题,在经过仔细确认Lua.lib库引用正确之后,在网上搜索,折腾了很久也没有找到相关信息(可能是搜索关键词不对)。突然想到Lua解析器也是调用这些接口的,却可以编译成功。仔细对比了一下,发现唯一的区别就是实现代码的后缀不同,它的是.c,而我的是.cpp。尝试了一下将我的文件改为.c的,居然编译成功。这时才想到Lua源码文件中有一个专门针对C++的头文件:lua.hpp,文件内容如下:

// lua.hpp
// Lua header files for C++
// <<extern "C">> not supplied automatically because Lua also compiles as C++

extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}


将下面的头文件
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
替换为

#include "lua.hpp"
此时,就可以顺利编译了!


这再一次提醒我:C写的函数要想在C++文件中调用,需要在函数前加extern "C".


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值