【问题标题】:DLL in sub folder rather than in application folderDLL 在子文件夹中而不是在应用程序文件夹中
【发布时间】:2011-09-29 10:05:52
【问题描述】:

已经使用 VC++ 创建了一个动态 python 文件 (pyd)。使用 cx_freeze,我创建了一个 exe。为了让这个程序在其他计算机上运行,​​我需要在应用程序文件夹中有一个文件 msvcr100.dll。我确实得到了想要的输出。

但是,Microsoft 的分发许可证明确规定 dll 文件应位于应用程序文件夹内的子文件夹中。子文件夹应命名为“Microsoft.VC100.CRT”。我尝试通过更改项目属性来玩弄 MS VC++ 中的设置。事实证明它非常棘手,因为我使用 MSVC++ 的唯一一件事是让我的 python 程序使用一些 c 选项并返回一些我可以在我的 python 程序中再次使用的输出。我玩过清单文件(嵌入和不嵌入),还在 VC++ 中设置了 Additional Libraries Directory

任何人都知道我可以做些什么来让我的 pyd 文件查看 Microsoft.VC100.CRT。

【问题讨论】:

  • 附加库条目用于静态链接,不指定运行时搜索的路径。

标签: python visual-c++ manifest cx-freeze pyd


【解决方案1】:

我不确定何时在您的脚本中加载 DLL,但假设它已延迟到您可以对其进行处理的地步,那么您可以自己加载库:

import os
import ctypes
try:
    here = os.path.dirname(__file__)
except NameError:
    here = os.getcwd()
dll = ctypes.CDLL(os.path.join(here, 'Microsoft.VC100.CRT', 'msvcr100.dll'))
del here

pywin32

import os
import win32api
try:
    dll = win32api.LoadLibrary('msvcr100.dll') #Never hurts to try
except win32api.error:
    try:
        here = os.path.dirname(__file__)
    except NameError:
        here = os.getcwd()
    #Just to prove messing with PATH does something.
    os.environ['PATH'] = os.environ['PATH'] + os.pathsep + os.path.join(here, 'Microsoft.VC100.CRT')
    dll = win32api.LoadLibrary('msvcr100.dll') #Give it another crank of the handle.
    #Or alternatively without messing with PATH
    dll = win32api.LoadLibrary(os.path.join(here, 'Microsoft.VC100.CRT', 'msvcr100.dll')) #Give it another alternative crank of the handle.
    del here

【讨论】:

  • 修复了 eryksun 的 cmets
  • 谢谢华夫蛋奶酥。我已经意识到问题所在了。请参阅下面的评论以获取解决方案。您的解决方案可能是正确的。但下面的一个对我有用
【解决方案2】:

我创建的动态 python 文件是使用 Visual C++ 2010 编译的。因此,为了使其工作,需要 MSVCR100.dll 文件。 然而,由于我还为我的最终程序创建了一个应用程序 (.exe),它依赖于 MSVCR90.dll。 由于 Microsoft 坚持这些 dll 应位于具有特定名称的文件夹中,因此我不能将这些文件放在应用程序文件夹中。因此,我所做的是使用 Visual C++ 2008 编译 pyd 文件。然后添加 MSVCR90.dll 文件以及相应的清单和 MSVCP90.dll 和 MSVCM90.dll 文件。这样就解决了问题。

我的猜测是,在我的程序运行之前需要两代 C 运行时文件。通过使用 VC++2008 编译 pyd 文件,我有效地将依赖关系减少到了一代。

【讨论】:

    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2016-05-27
    • 2016-07-20
    相关资源
    最近更新 更多