0

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

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

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

4

2 回答 2

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
于 2011-09-29T11:56:27.943 回答
0

我创建的动态 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 文件,我有效地将依赖关系减少到一代。

于 2011-10-10T19:16:01.960 回答