【发布时间】: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