C++ Unresolved External Symbols Embedded Lua(基于 longjmp 问题)(不重复)
Posted
技术标签:
【中文标题】C++ Unresolved External Symbols Embedded Lua(基于 longjmp 问题)(不重复)【英文标题】:C++ Unresolved External Symbols Embedded Lua ( based on longjmp issue ) ( not duplicate ) 【发布时间】:2022-01-03 23:23:28 【问题描述】:我将问题描述如下:
编译器:Visual Studio 2019
问题的根源在于,由于我手动将代码映射到进程,因此 longjump 使进程崩溃。
代码运行良好,如下所示,但由于 longjump 导致 lua 脚本中的任何语法错误都会崩溃:
extern "C"
#include "lua.h"
#include "lualib.h"
.....
我希望 C++ 异常源自:
#if defined(__cplusplus) && !defined(LUA_USE_LONGJMP) /* */
/* C++ exceptions */
#define LUAI_THROW(L,c) throw(c)
#define LUAI_TRY(L,c,a) \
try a catch(...) if ((c)->status == 0) (c)->status = -1;
#define luai_jmpbuf int /* dummy variable */
#elif defined(LUA_USE_POSIX) /* */
/* in POSIX, try _longjmp/_setjmp (more efficient) */
#define LUAI_THROW(L,c) _longjmp((c)->b, 1)
#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) a
#define luai_jmpbuf jmp_buf
#else /* */
/* ISO C handling with long jumps */
#define LUAI_THROW(L,c) longjmp((c)->b, 1)
#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) a
#define luai_jmpbuf jmp_buf
#endif /* */
因为 longjmp 使我的进程崩溃。
所以我决定用 C++ 编译器(没有外部 C)编译我的代码,并且:
#include "lua.h"
#include "lualib.h"
.....
我是这样称呼它的。但这也导致了以下问题: 错误 LNK2019:未解析的外部符号 _lua_pcall ... ... ...
我想了很多,但找不到解决方案。这是一个链接器错误,因为所有的lua头和c文件都加入了我的项目,这很荒谬。
【问题讨论】:
我发现这个线程是类似的问题:***.com/questions/68390401/cant-compile-lua-as-c 不重复?你怎么知道?请编辑问题并添加一个证明来证明这个真正非凡的主张。 “所以我决定用 C++ 编译器(没有外部 C)编译我的代码”。您为什么决定这样做? “所以我决定用 C++ 编译器编译我的代码(没有外部 C)”。你为什么决定这应该有效?说到这部分,try catch 块适用于我的代码。但是当我在代码中调用 longjmp 或 setjmp 时,即使在一个独立于 lua 的地方,我也会崩溃,因为(猜想)我离 tls 很远。 try catch 块应该可以工作,它可以工作。 据我所知,您的代码没有任何效果,因为您有链接器错误。extern "C"
是有原因的。你删除了它,现在想知道为什么你有一个未定义的引用。因为你删除了extern "C"
,这就是原因。
lua-users.org/wiki/BuildingLua "在 C++ 应用程序中嵌入 Lua 的注意事项" lua 可以编译为 c 和 c++。我想你不明白我的问题,要使用我需要在 C++ 中编译的 try catch 块。我不应该为此也从“c”中提取出来吗?
【参考方案1】:
#define LUAI_THROW(L,c) c->throwed = true
#define LUAI_TRY(L,c,a) \
__try a __except(filter()) if ((c)->status == 0 && ((c)->throwed)) (c)->status = -1;
#define luai_jmpbuf int /* dummy variable */
顺便说一句,我这样解决了我的抛出异常问题。我不确定它是否正确,但不再崩溃了。
struct lua_longjmp
struct lua_longjmp *previous;
luai_jmpbuf b;
volatile int status; /* error code */
bool throwed;
;
即使您在没有 C++ 异常的情况下构建也能按预期工作
【讨论】:
以上是关于C++ Unresolved External Symbols Embedded Lua(基于 longjmp 问题)(不重复)的主要内容,如果未能解决你的问题,请参考以下文章
C++ 覆盖虚方法抛出错误“LNK2001: unresolved external symbol”
C++静态成员变量必须在类的定义之外进行声明 (error LNK2001: unresolved external symbol)
C++静态成员变量必须在类的定义之外进行声明 (error LNK2001: unresolved external symbol)
C++静态成员变量必须在类的定义之外进行声明 (error LNK2001: unresolved external symbol)
c++程序错误error LNK2001: unresolved external symbol "public: void __thiscall CEmp::print(void)&quo