gpt4 book ai didi

c++ - 多个 C++ .lib 项目到 .dll 项目,Lua 崩溃!

转载 作者:行者123 更新时间:2023-11-30 02:11:31 25 4
gpt4 key购买 nike

今天,我尝试让“编辑并继续”在我的解决方案中工作,如下所示:

游戏引擎.lib <- 游戏.lib <- 编辑器.exe

                        <- Server .exe

<- Client .exe

效果很好。但现在我想将引擎和游戏 .libs 转换为 .dlls,这样我就可以使用 Visual Studio C++ 的“编辑并继续”功能。

所以我在那里得到了一堆“__declspec(dllexport)”等等。工作正常,它运行了!

但在某些情况下它会崩溃。实际上,它总是在与释放内存相关的 Lua 函数中崩溃。

引擎和游戏都使用 Lua,它们都有自己的静态 C++ 接口(interface)函数。

我不确定,但我想 .dll 有点像没有主函数的 .exe,并且每个都有自己的内存。因此,例如当 Game.dll 导致 Lua 分配一些内存,而 Engine.dll 导致 Lua 再次释放它时,砰!正确吗?

关于如何解决这个问题的任何想法?当然Engine.dll应该负责Lua,但是Game.dll应该可以用新的静态函数扩展接口(interface)。

编辑:在我将 Lua 本身变成一个 .dll 后,不再有崩溃。在我尝试这个之前,我还使用与所有其他项目相同的编译器重新编译了静态,我仔细检查了运行时库,它们都是一样的,我正在链接到正确的调试/发布库。我仍然很好奇这里发生了什么。

祝你有个愉快的一天

安东

附言为什么我无法控制 Stackoverflow 的返回?

最佳答案

你写道:

The engine and the game both work with Lua, they both have their own static C++ interface functions.

这向我暗示了引擎和游戏都单独静态链接到 Lua 拷贝的可能性。

如果那是真的,那么如果将一个拷贝创建的 Lua 状态传递给另一个拷贝,这正是您期望发生的情况。典型的结果是弄乱内存状态并破坏分配器。根本原因是值nil的实现依赖于Lua引擎内部某物的地址。链接到同一进程的引擎的第二个拷贝将有一个不同的地址作为其 nil 的概念。这种方式最终会导致疯狂。

当然,如果游戏和引擎共享一个 Lua 解释器拷贝(比如都使用 LUA51.DLL),那么我就错了。

关于c++ - 多个 C++ .lib 项目到 .dll 项目,Lua 崩溃!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3383932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com