C++ 理解静态链接嵌入式lua环境中lua扩展dll的构建/加载
我有一个相对复杂的lua环境,我正试图理解以下内容是如何工作的。启动设置包括以下两个模块: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环境)
- DLL(静态链接到lua库,包括解释器)
编辑:我已经看过了,我相信它最终可能有助于提供一个解决方案,但我想在链接器级别了解它。答案归结为:
请记住,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模块。你需要使用;有关解决方案和相关讨论,请参阅