Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 理解静态链接嵌入式lua环境中lua扩展dll的构建/加载_C++_C_Dll_Lua_Linker - Fatal编程技术网

C++ 理解静态链接嵌入式lua环境中lua扩展dll的构建/加载

C++ 理解静态链接嵌入式lua环境中lua扩展dll的构建/加载,c++,c,dll,lua,linker,C++,C,Dll,Lua,Linker,我有一个相对复杂的lua环境,我正试图理解以下内容是如何工作的。启动设置包括以下两个模块: 主应用程序(无lua环境) DLL(静态链接到lua库,包括解释器) dll加载到主应用程序中,并运行lua控制台解释器和可从控制台访问的lua API 现在,假设我想扩展这个设置,包括另一个扩展luaapi的dll,例如luasql。新的dll需要链接到lua才能构建,我的理解是,我不能静态链接到lua,因为现在在加载扩展dll时,会有两个lua代码的非共享副本。但是,即使我将lua core库构建

我有一个相对复杂的lua环境,我正试图理解以下内容是如何工作的。启动设置包括以下两个模块:

  • 主应用程序(无lua环境)
  • DLL(静态链接到lua库,包括解释器)
dll加载到主应用程序中,并运行lua控制台解释器和可从控制台访问的lua API

现在,假设我想扩展这个设置,包括另一个扩展luaapi的dll,例如luasql。新的dll需要链接到lua才能构建,我的理解是,我不能静态链接到lua,因为现在在加载扩展dll时,会有两个lua代码的非共享副本。但是,即使我将lua core库构建为dll并与扩展dll链接,主应用程序或主dll也不会在运行时加载该lua core dll。因此,我的问题是:

  • 如果我从主dll中的lua intepreter加载扩展dll,考虑到不会加载lua核心dll,会发生什么
  • 如果我在运行时加载lua核心dll,那么这与静态链接的lua库有何冲突
  • 这两种情况(在扩展dll中静态链接和动态链接/加载lua dll)是否会导致有两个lua核心代码副本正在进行中
  • 在这种情况下,如果我尝试从扩展dll中构建/加载的主dll的lua环境/解释器调用API函数,会发生什么
  • 或者lua是否有某种特殊的机制来加载本机DLL,这些DLL提供了新的C API函数,允许它绕过正常的链接规则
  • 希望我已经提供了足够的细节,使问题具体化,如果没有,我将很乐意进一步完善场景/问题


    编辑:我已经看过了,我相信它最终可能有助于提供一个解决方案,但我想在链接器级别了解它。

    答案归结为:

  • 不要尝试从链接到不同Lua核心的dll加载任何Lua扩展。这样做将导致彻底的混乱
  • 只要加载的任何Lua扩展都将其所有依赖项解析为适当的Lua核心,那么使用多少Lua核心并不重要(除了bloat)

  • 请记住,windows总是根据符号的名称及其提供的dll解析符号。

    加载一个解释器(假设它是静态链接的)并加载一个模块X(该模块X与带有Lua解释器的dll相链接,后者加载解释器的另一个副本)时,不会出现这种情况。这可能会导致应用程序崩溃。您需要使已加载的dll使用已加载的解释器,或者通过解释器链接该dll,或者使用代理dll(见下文)

    您有两个主要选项:(1)生成由主应用程序加载的dllA,而主应用程序又依赖于LUADLL;然后,您可以将所有其他lua模块链接到lua dll,而不会出现任何问题;或者(2)将Lua dll包括到dllA中,但保持Lua方法公开,以便可以针对该dllA链接Lua模块

    我认为第一个选项要简单得多,并且可能不需要对Lua模块进行任何更改(只要您可以保持luadll的名称与编译模块时使用的名称相同)

    我应该提到的另一个选项是,即使应用程序静态编译了Lua解释器,您仍然可以使用针对Lua DLL编译的Lua模块。你需要使用;有关解决方案和相关讨论,请参阅