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