2009年4月29日星期三

VC2008链接MSVCRT.DLL不完全折腾

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,问题依旧。

折腾失败……

没有评论 :