Ruby在Windows上有一个很讨厌的问题,其动态链接库文件名中包含了CRT库的文件名。例如用VC6编译的Ruby 1.8.6库名为msvcrt-ruby18.dll,而VC2008编译的则叫msvcr90-ruby18.dll。网上能找到的Ruby C库几乎都是用VC6编译的,如果你用的Ruby不是VC6编译的那就没法用。
造成这个问题的主要原因是不同版本VC的CRT库不兼容,ERRNO、alloc、free等在不同版本的CRT中混用会出问题。虽然这些问题似乎都可以绕过去,可Ruby社区的大牛小牛都不太喜欢搭理Windows的样子。总之现状就是,要么老实用VC6,要么所有东西都自己编译一遍。
我为啥会对这个问题有兴趣?因为新版本的VC编译出来的东西通常情况下会快一点,例如Ruby 1.9.1中的dl模块,VC2008编译出来的代码比VC6编译的至少要快50%。
几天前在网上翻到一个法子,说是链接Windows Driver Kit中包含的msvcrt.lib即可使用旧版CRT,于是忍不住试了试。结果,还是有问题。
尝试用VC2008和WDK编译一个Hello World,的确是依赖msvcrt.dll。可是在编译Ruby 1.9.1的时候,其他错误都可以通过修改代码解决,但最后却卡在environ上,“无法解析的外部符号 __imp___environ”。
写段测试代码:
#include <stdio.h> #include "stdlib.h" int main( int argc, char *argv[] ) { char **rb_origenviron = environ; printf( "Hello World!\n" ); printf("%s\n", rb_origenviron[0]); return 0; }
cl /MD t.c,问题依旧。
折腾失败……
没有评论 :
发表评论