【问题标题】:C++ with Visual Studio 2017 - manipulate the library search order when load-time dynamic linkingC++ 与 Visual Studio 2017 - 在加载时动态链接时操纵库搜索顺序
【发布时间】:2018-12-20 15:10:42
【问题描述】:

我在 Windows 上有一个用 MSVC 编译的 C++ 应用程序,它在运行时链接到许多 dll。该应用程序有一个 Excel 前端:用户可以加载到 Excel 中的 .xll 文件。用户应该能够从任何位置加载 xll。

所有 dll 都位于共享驱动器上,并且没有一个用户将此位置添加到他/她的 windows 路径变量中(我不希望这样,因为这些 dll 可能与其他程序发生冲突)。我已经制作了这样的应用程序,当应用程序启动时,Windows 路径变量会在本地更改(仅在应用程序运行的会话中)以包含这些 dll 的路径。

这只是因为在我的 Visual Studio 解决方案中,我能够指定这些 dll 应该延迟加载(运行时动态加载)。

我的问题来了:我想将 boost-python 用于 python 前端。 Boost python 强制我的应用程序在应用程序启动时加载 python27.dll(加载时链接),即没有延迟。

我实际上尝试了延迟链接,并得到以下错误: 1>链接:致命错误LNK1194:由于导入数据符号'__imp___Py_NoneStruct',无法延迟加载'python27.dll';没有 /DELAYLOAD:python27.dll 的链接

我的问题是我是否可以在我的应用程序中以某种方式修改加载时搜索路径?

请注意,所有使用 Excel 前端的用户不打算使用 python 前端(这意味着另一组用户),所以我不能确定这些 Excel 用户是否安装了 python,尤其不是 2.7 版。

提前非常感谢, 内尔

【问题讨论】:

  • 正如 Rob K 的回答:这正是启动器可以为您做的。一个批处理文件或另一个 exe,它只是设置正确的执行环境,然后启动一个运行实际可执行文件的进程。您甚至可以将您的可执行应用程序打包到一个延迟加载的 dll 中,然后在您修改环境后将其加载到您的启动器中......
  • 为什么不为那些使用 excel 的人编译一个非 python 版本?因为它看起来对 python 用户来说不是问题,就像你最后一段所说的那样。
  • 非常感谢您的 cmets。那里有一些旧代码导致在 excel 编译中需要 python。我删除了它,现在我的 excel 插件不再依赖于 python27.dll。

标签: c++ dynamic-linking load-time


【解决方案1】:

您无法从应用程序中修改加载时搜索路径,因为您的应用程序尚未加载以执行任何操作。您可以做的最好的事情是某种类型的包装器,如批处理文件或其他脚本,它们将设置环境,或者将具有完全限定路径的 DLL 链接到网络共享。

【讨论】:

  • 嗨 Rob,我实际上尝试在应用程序项目的 Linker->General->Additional Library Directories 中设置 dll 路径,但这不起作用(它适用于 .lib 文件)。还有其他方法吗?
  • 我不确定它是否会起作用,但在您的“延迟加载 Dlls”设置中,指定 Dll 的完全限定路径,而不仅仅是 Dll 的文件名。在我想有条件地加载 Dll 的项目中,我编写了一个基类,它将 LoadLibrary() 包装在构造函数中,FreeLibrary() 在析构函数中,并具有按名称或序号查找函数地址的函数。我为每个我想要动态加载的 Dll 派生了类。
  • 你可能会考虑的另一件事是writing your own delay-load helper function
  • 嗨 Rob,延迟加载工作正常(当延迟加载需要发生时,路径已经包含 dll 的位置。我的问题是我不能延迟加载python。最后,我删除了一些旧代码,这些代码为excel插件创建了对python的依赖。现在一切正常。
猜你喜欢
  • 2012-06-28
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多