【问题标题】:Compiling Python extensions with different Visual Studio version使用不同的 Visual Studio 版本编译 Python 扩展
【发布时间】:2014-07-26 01:59:21
【问题描述】:
根据Python documentation,在 Windows 上编译 Python 扩展时,“您应该使用与构建 Python 本身相同版本的 VC++”。通常给出的解释是VC运行时版本不匹配会导致问题。但是,可以使用似乎可以正常工作的较新 Visual Studio 版本来编译扩展。
在哪些情况下不同的运行时会导致问题?我在这个主题上看到的最多信息是 python-dev 邮件列表上的this thread。是否有一组(希望很小)导致问题行为的用例,或者我还没有遇到任何问题只是运气问题?
【问题讨论】:
标签:
python
visual-c++
python-extensions
【解决方案1】:
该邮件线程是我所见过的 C 运行时不匹配导致问题的最全面的列表。一般问题是每个运行时不与其他运行时共享任何内容,每个运行时都有自己独立的状态,并且它们对外暴露的任何内容都不能通过您自己的代码在运行时之间共享。前一个问题意味着每个运行时都有自己的errno,第二个问题意味着您不能将一个运行时打开的FILE *' 对象与另一个运行时的文件I/O 函数一起使用。
枚举所有可能的问题意味着枚举运行时的整个可见状态(包括间接可见状态),然后枚举它们可以生成和接收的每个可能不兼容的值。
虽然Microsoft's promise 稍微抵消了这一点,但使用 Microsoft C/C++ 编译器的一个版本编译的目标文件 (.OBJ) 应该与编译器的后续版本兼容。这意味着,例如,两个不同的运行时不会为 errno 使用一组完全不同的值(例如,ENOENT 始终为 2),因为这些值将在目标文件中显示为常量。