我有一个相对复杂的lua环境,我试图了解以下内容是如何工作的。启动设置包括以下两个模块:
将dll加载到主应用程序中,并运行lua控制台解释器和可从控制台访问的lua API。
现在,让我们说我想扩展这个设置以包含另一个扩展lua API的dll,例如luasql。新的dll需要链接到lua才能构建,我的理解是我无法静态链接lua,因为当我加载扩展dll时,现在会有两个非共享的lua代码副本。但是,即使我将lua核心库构建为dll并使用扩展dll链接它,该lua核心dll也不会在运行时由主应用程序或主dll加载。所以我的问题是:
希望我提供了足够详细的信息来解决具体问题,如果不是,我会很乐意进一步完善情景/问题。
编辑:我查看了Bundling additional Lua libraries for embedded and statically linked Lua runtime,我认为最终提供解决方案可能会有所帮助,但我想在链接器级别了解它。
答案 0 :(得分:2)
当你加载一个解释器时(假设它是静态链接的)并且加载一个与一个dll链接的模块X和一个Lua解释器,加载另一个解释器副本,你就不会遇到这种情况。这可能会导致应用程序崩溃。您需要使加载的dll使用已加载的解释器,方法是使用解释器链接该dll或使用代理dll(参见下文)。
您有两个主要选项:(1)使主应用程序加载的dllA依赖于Lua dll;然后,您可以将所有其他lua模块与Lua dll链接,而不会出现任何问题;或者(2)将Lua dll包含到dllA中,但保持Lua方法暴露,以便lua模块可以与该dllA链接。
我认为第一个选项更简单,并且可能不需要对Lua模块进行任何更改(只要您可以保持Lua dll的名称与编译模块的名称相同)。
我应该提到的另一个选择是你仍然可以使用针对Lua DLL编译的Lua模块,即使应用程序具有静态编译的Lua解释器。你需要使用proxy DLL;有关解决方案和相关讨论,请参阅this maillist thread。
答案 1 :(得分:1)
答案归结为:
请注意,Windows始终会根据名称和解析符号来解析符号。