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)

unresolved external symbol 问题

c++程序错误error LNK2001: unresolved external symbol "public: void __thiscall CEmp::print(void)&quo