【问题标题】:Compiler dependency in ctypesctypes 中的编译器依赖性
【发布时间】:2014-09-29 02:13:20
【问题描述】:

我有一个第三方封闭源代码库,它是使用 Visual Studio 2010 构建的 Windows DLL。 首先,我计划使用例如为该 dll 构建一个扩展模块。痛饮。 然而,它是用 VS 2010 构建的,而所有 python 2 发行版都是用 VS 2008 构建的,这一事实破坏了这一点。

现在看来 ctypes 没有这个限制。 我使用 VS 2010 构建了一个微不足道的 dll(dependency walker 显示 dll 链接到 msvcr100.dll),并带有一个函数:

int fnTestLib2(int a, int b)
{
    return a+b;
}

在 ctypes 中加载它并

fcn = mydll.fnTestLib2
fcn.argtypes = [ctypes.c_int, ctypes.c_int]
fcn.restype = ctypes.c_int
print fcn(1,2)

正确打印3

现在,我有些困惑: 这仅仅是因为我很幸运并且因为这个例子是微不足道的,还是ctypes 的底层技术和扩展模块有根本的区别? 如果是,那是什么? ;)

最后:为第三方 dll 实现 ctypes 包装库是否安全?

编辑 根据 Serge 的回答,我使用 distutils 结合 Windows SDK 编译了我的 swig 扩展。 所以,现在我有了我的扩展 bla.pyd,它似乎确实有效。 虽然我想知道这种对两个 c 运行时的依赖是否值得推荐。用dependency walker查看:

【问题讨论】:

  • 您是否尝试过调用一些标准库函数,特别是那些属于 VS2010 运行时但尚未在 VS2008 中的函数?
  • 据我所知,Windows DLL 可以正常工作:每个模块都有指向它需要的模块的指针,并且不同版本的 msvc dll 确实有不同的名称。所以我无法理解错误链接可能发生在哪里。即使是微软也可以做一些好事......过去的 DLL 地狱来自于一个事实,即一个 dll 的不同版本具有相同的名称,即使兼容性没有完全保证!

标签: python c++ c windows


【解决方案1】:

我不是 SWIG 而非 ctypes 方面的专家,但我年轻时经常在 Windows dll 地狱中挣扎。

首先,您的示例太琐碎了。由于您没有从标准库中调用任何函数,因此即使路径中没有 mscvr100.dll,该示例也可以工作。您至少应该尝试使用一个简单的函数,例如 strlen(而不是 lstrlen,这将是一个 Windows API 函数......):

#include <string.h>
int testfunc(char *str) {
    return strlen(str);
}

我无法测试,因为我目前没有 VS2013 编译器。

接下来,SWIG 和 ctypes 有一个主要区别:

  • SWIG 将 C/C++ 源代码 代码与 Python 接口
  • ctypes 直接将可执行 dll 与 Python 接口

由于 ctypes 直接与 dll 接口,因此您不必担心 dll 是由哪个编译器编译的,也不必担心它使用了哪个其他 dll只要它们在路径上。如果它必须使用 静态库 (xxx.a),那将是非常不同的,因为在这种情况下,库格式应该是兼容的。您只需要知道使用什么调用约定(stdcall 或 cdecl)就可以知道您应该使用 windll 还是 cdll(分别)。

顺便说一句,根据 SO How to create a DLL with SWIG from Visual Studio 2010 上的其他帖子,也可以使用 VisualStudio 2010 为 Python 创建一个扩展 dll。这是正常的,因为从 python 方面来看,扩展库只是一个 dll,它就这样使用它,但困难的部分是从 VisualStudio 环境中访问 Python dll。

【讨论】:

  • 其他 SO 帖子让我很好奇。我在网上找到的所有内容都告诉我,您需要与 python 使用相同的 mscv 运行时(在我的例子中是 2008 年)...
  • 我有相同的来源:-)。环境不一样的问题是不能使用Python的导入库来生成扩展dll,而不是访问dll。
  • 你得到了我的 100 次重复 :) 你帮助澄清了一些观点。 FWIW:我仍然会选择 ctypes 和一个单独的 C 库。事实证明 SWIG 开销毕竟不是那么小,我真的不想要那个库的“完整”接口......
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多