问题描述:
在Windows下面使用Ruby(CRuby)作为嵌入式脚本语言时,使用fclose会出问题。
问题原因:
在win32.h头文件中定义了
#define fclose(f) rb_w32_fclose(f)
使fclose重定向到了rb_w32_fclose
表现状况:
动态链接编译正常, 一旦使用fclose(C++ fsteam里面close也会调用),程序异常
静态链接提示fclose与默认库冲突
原因探究:
不知道为什么一句宏定义会生成一条函数,还能被导出,看来对C/C++了解还是太少了。那句宏有个条件,就是
#ifdef RUBY_EXPORT
这个在 Ruby\Win32\下有个makefile.sub文件,250行左右(请搜索)有行
-DRUBY_EXPORT
就是cl的宏定义, 定义RUBY_EXPORT,但是去掉之后本机编译失败。
在网上搜索了一个,国外也有这样的问题(但是只有几例):
0.Ruby为什么会常试定义fclose这个东西
1.定义也就算了,还不对称: fopen没有定义 _wfopen没有定义
但是使用官方提供的文件(windows版只给到1.9X),没有fclose问题,看来是编译的方式不对,在正确方法解决前只能常试下面的妥协方案,
有人知道正确的方法请联系一下笔者,感谢
妥协方案:
在win32.h(ruby\include\ruby下)
#define fclose(f) rb_w32_fclose(f)
换成
#define fclose(f) fclose(f)
这样就不会导出fclose函数了。不过修改了文件,请注意Ruby的License