使用不同的Visual Studio版本编译Python扩展
根据Python的官方文档,在Windows上编译Python扩展时,“你应该使用与构建Python时相同版本的VC++”。通常的解释是,不同版本的VC运行时会导致问题。不过,实际上使用更新版本的Visual Studio编译扩展也是可以的,而且看起来也没什么问题。
那么,在哪些情况下,不同的运行时会导致问题呢?我看到的关于这个话题的信息主要来自于python-dev邮件列表上的这个讨论。有没有一些(希望是少量的)特定情况会导致问题,还是说我目前没遇到麻烦只是运气好呢?
1 个回答
1
这个邮件讨论串是我见过的关于不匹配的C运行时导致问题的最全面的列表。一般来说,问题在于每个运行时之间没有任何共享的东西,每个运行时都有自己独立的状态,而它们对外暴露的内容也不能在你的代码中跨运行时共享。第一个问题意味着每个运行时都有自己的errno
,而第二个问题则是你不能用一个运行时打开的FILE *'
对象去调用另一个运行时的文件输入输出函数。
要列举所有可能的问题,就得把运行时的所有可见状态(包括间接可见的状态)都列出来,然后再列出它们可能生成和接收的每一个值,这些值可能会不兼容。
不过,有一点可以稍微缓解这个问题,那就是微软的承诺,即用某个版本的微软C/C++编译器编译的目标文件(.OBJ)应该能与后续版本的编译器兼容。这意味着,比如说,两个不同的运行时不会使用完全不同的errno
值(例如,ENOENT
总是2),因为这些值会作为常量出现在目标文件中。