Project1

标题: Ruby1.9.2怎么在MSVC++里面运行? [打印本页]

作者: yangff    时间: 2011-9-21 23:10
标题: Ruby1.9.2怎么在MSVC++里面运行?
就是那个DLL的方式我是知道怎么用的API我也都会。
1.8的我也用过也可以用。
1.8的include还有1.9的include我是直接用RGE的Include
然后这次重装把svn密码弄没了……
求助include和lib是怎么弄到的?
我用VS2010编译了Ruby1.9.2,
.ext目录下面的include不对根本没有ruby.h
Ruby根目录下面和编译的的include提示各种少东西……

lib倒是有了叫做msvcr100-ruby191。
可是我又不能把这个版本的Ruby发布出去,(或者有什么办法支持库和so?)
RubyInstaller安装的Ruby是msvcrt-ruby191.dll……
所有环境都是VS2010+VC++
求解释怎么得到include!


yangff于2011-9-21 23:11补充以下内容:
如果不行的话我就只能用管道了……
作者: 苏小脉    时间: 2011-9-22 04:38
本帖最后由 苏小脉 于 2011-9-22 04:54 编辑

CRuby 实现是依赖 autoconf 来组建的,你的工程也用 autoconf 便最好,便不用,至不济也可把需要的那几个宏一一定义了,之后再包含 include 下的 ruby.h 便无事。autoconf 依赖的宏多是一些决定环境的旗帜,如当前编译环境是否有 intptr_t、long long,指针大小是 32 位还是 64 位等。近年来也有不少人反映 autoconf 用户友好性低下,有不少同好转去 CMake,只是 hardcore GNU 或是已熟练于 GNU 工具链的用户仍情有独钟。

其实 Ruby 那些头文件中有不少名字污染(并未以 rb_ 为前缀的标识符),把你需要的类型声明、宏、接口原型从头文件中提取出来,便可在避免命名冲突的同时也无须和 autoconf 打交道,此法只移植性差些。写 Ruby 扩展往往不用考虑这些,因标准库中的 mkmf 就相当于 Ruby 版的 autoconf 了,配置妥当后直接根据环境生成 Makefile。若是嵌入 Ruby,通常就需要做更多工作。像 RGE2 目前就从 Ruby 头文件中提取了常用的结构、宏和原型,同时也区分了 1.8 和 1.9 的头文件差异(这也反映了 CRuby 双向兼容之不足)。RGE2 的 SVN 工程可以匿名签出,无须用户名,杨卿不妨参考。

.lib 文件是微软平台下用于链接时导入符号的导入库,此种文件无须发布,仅用于组建工程时,需要发布的是 .dll,盖实际代码储存于其中。如果是 MinGW 编译的 Win32 DLL,那便连 .lib 也可免去,直接链接 DLL 即可。MSVC 的则须同时生成 .lib 和 .dll。Win32 下以相同代码生成的 .so 文件和 .dll 文件只有二进制层级区别,并无实质程序行为区别,只是按 Un*x 命名习俗,(动态)共享库扩展名为 so(静态库为 .a)罢了。
作者: yangff    时间: 2011-9-22 19:22
本帖最后由 yangff 于 2011-9-22 19:23 编辑
苏小脉 发表于 2011-9-22 04:38
CRuby 实现是依赖 autoconf 来组建的,你的工程也用 autoconf 便最好,便不用,至不济也可把需要的那几个宏 ...


RGE用C++是可以编译的。不过问题在于我根本找不到一个可以用的include文件。会提示socket什么的莫名其妙错误……但是nmake是可以编译。纠结……
关键是SVN的地址也丢了……硬盘悲剧了
作者: 苏小脉    时间: 2011-9-22 21:33
yangff 发表于 2011-9-22 19:22
RGE用C++是可以编译的。不过问题在于我根本找不到一个可以用的include文件。会提示socket什么的莫名其妙 ...

RGE 当然可以编译,因为提取工作都做好了。或许我没理解你的需求,nmake 你只要用的是 cl + link 工具链那就是“MSVC 编译”的了。你还想怎样?
作者: yangff    时间: 2011-9-22 21:36
苏小脉 发表于 2011-9-22 21:33
RGE 当然可以编译,因为提取工作都做好了。或许我没理解你的需求,nmake 你只要用的是 cl + link 工具链 ...

好吧……我的问题就是是怎么提取的,还有我用VC编译的程序里面用VC编译的ruby的lib和头,那我发布的时候直接让用户安装由mingw编译的RubyInstaller会有问题吗?
作者: 苏小脉    时间: 2011-9-22 21:59
yangff 发表于 2011-9-22 21:36
好吧……我的问题就是是怎么提取的,还有我用VC编译的程序里面用VC编译的ruby的lib和头,那我发布的时候 ...

用到的什么就从头里复制粘贴出来,遇到根据环境而变的定义时选择符合你当前环境的(如 VS2010 支持stdint.h,那 VALUE 类型就可定义为 uintptr_t)。Ruby 本身用工程提供的 nmake 配置组建。

我用VC编译的程序里面用VC编译的ruby的lib和头,那我发布的时候直接让用户安装由mingw编译的RubyInstaller会有问题吗?

VC 7.0 以后编译会生成 msvcr*-ruby???.dll,MinGW 编译会生成 msvcrt-ruby???.dll,两者链接的 CRT 实现版本不同。msvcrt.dll 是系统组件,而 msvcr*.dll 则是针对 Visual Studio 7.0 以后版本的。据 MinGW 的文档所说,链接到 msvcrt.dll 是为了避免许可问题。你如果用 MSVC 成功编译了 Ruby,那发布 msvcr*-ruby???.dll 就行了。
作者: yangff    时间: 2011-9-22 23:09
苏小脉 发表于 2011-9-22 21:59
用到的什么就从头里复制粘贴出来,遇到根据环境而变的定义时选择符合你当前环境的(如 VS2010 支持stdint ...

用到什么复制什么?那那些什么defines.h,config.h什么的都不要直接从Ruby.h里面复制?

就是不能发布成msvcr*-ruby啊……那样用gem和库有问题,RubyInstaller的比较方便的说……
作者: 苏小脉    时间: 2011-9-23 00:46
yangff 发表于 2011-9-22 23:09
用到什么复制什么?那那些什么defines.h,config.h什么的都不要直接从Ruby.h里面复制?

就是不能发布成m ...

config.h 那些是 autoconf 生成的环境配置,你如果只是以二进制形式发布工程,那直接配置为你当前的 build 环境就行了,不用理会 autoconf 的那堆宏。

"遇到根据环境而变的定义时选择符合你当前环境的(如 VS2010 支持stdint.h,那 VALUE 类型就可定义为 uintptr_t)”。

就是不能发布成msvcr*-ruby啊……那样用gem和库有问题,RubyInstaller的比较方便的说……

只要你的 Gem 路径是正确的,会有什么问题?又不像 RM 一样没导出 Ruby API。至少我至今为止没发现问题。
作者: yangff    时间: 2011-9-23 19:06
苏小脉 发表于 2011-9-23 00:46
config.h 那些是 autoconf 生成的环境配置,你如果只是以二进制形式发布工程,那直接配置为你当前的 buil ...

gem路径要怎么设置?用api的形式的话。还有我直接用Ruby的DLL,也即是#include <ruby.h>的时候都不能用so啊……
作者: 苏小脉    时间: 2011-9-23 23:26
yangff 发表于 2011-9-23 19:06
gem路径要怎么设置?用api的形式的话。还有我直接用Ruby的DLL,也即是#include 的时候都不能用so啊…… ...

什么叫 “API 形式”?难道你还不在 Ruby 里用 Gem?Gem 一般都只是导出了一个 Init_* 入口点,其余函数都直接封装到 Ruby 空间了。你可以在一个配置良好的 Ruby 环境中打印出 $: 这个全局变量的值,就知道如何配置 Gem 路径了。

RM倒是导出了ruby的api

此话怎讲?
作者: yangff    时间: 2011-9-23 23:28
本帖最后由 yangff 于 2011-9-23 23:31 编辑
苏小脉 发表于 2011-9-23 23:26
什么叫 “API 形式”?难道你还不在 Ruby 里用 Gem?Gem 一般都只是导出了一个 Init_* 入口点,其余函数 ...


Rm的dll是完整的msvcr*-ruby???.dll无误
还有
#ifndef RUBY_LIB_PREFIX
#include "ruby/config.h"
#ifdef RUBY_EXTCONF_H
#include RUBY_EXTCONF_H
#endif
这是ruby/ruby.h里面的,这个config文件不存在,何解?
作者: 李梦遥    时间: 2011-9-23 23:52
两位敢交换QQ私聊而不刷帖嘛?
作者: yangff    时间: 2011-9-23 23:55
还有……用Ruby.h的时候
  1.         38        IntelliSense: cannot overload functions distinguished by return type alone        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h        2059        1       
  2.         39        IntelliSense: cannot overload functions distinguished by return type alone        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h        2081        1       
  3.         41        IntelliSense: cannot overload functions distinguished by return type alone        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h        2118        1       
  4.         42        IntelliSense: cannot overload functions distinguished by return type alone        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h        2138        1       
  5.         43        IntelliSense: cannot overload functions distinguished by return type alone        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h        2158        1       
  6.         44        IntelliSense: cannot overload functions distinguished by return type alone        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\winsock2.h        2176        1       
  7.         4        IntelliSense: expected an identifier        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h        390        5       
  8.         5        IntelliSense: expected an identifier        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h        391        5       
  9.         6        IntelliSense: expected an identifier        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h        392        5       
  10.         7        IntelliSense: expected an identifier        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h        399        5       
  11.         8        IntelliSense: expected an identifier        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h        405        5       
  12.         9        IntelliSense: expected an identifier        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h        406        5       
  13.         10        IntelliSense: expected an identifier        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h        407        5       
  14.         11        IntelliSense: expected an identifier        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h        423        5       
  15.         12        IntelliSense: expected an identifier        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2def.h        433        5       
复制代码

作者: 苏小脉    时间: 2011-9-24 00:03
yangff 发表于 2011-9-23 23:28
Rm的dll是完整的msvcr*-ruby???.dll无误
还有
#ifndef RUBY_LIB_PREFIX

你查看一下 RGSS????.dll 的导出表就知道了,除了几个正则表达式引擎的抽象接口之外,就只剩下 RM 的高层接口了。如下:

    ordinal hint RVA      name

          1    0 0011F71C EncDefaultCharEncoding
          2    1 00003E00 RGSSAddRTPPath
          3    2 00003B70 RGSSAudioFinalize
          4    3 00003B10 RGSSAudioInitialize
          5    4 00003E10 RGSSClearRTPPath
          6    5 00003CE0 RGSSErrorMessage
          7    6 00003CC0 RGSSErrorType
          8    7 00003C10 RGSSEval
          9    8 00003B00 RGSSFinalize
         10    9 00003E20 RGSSGC
         11    A 00003B90 RGSSGameMain
         12    B 00003C30 RGSSGetBool
         13    C 00003EC0 RGSSGetDouble
         14    D 00003E30 RGSSGetInt
         15    E 00003D10 RGSSGetPathWithRTP
         16    F 00003DF0 RGSSGetRTPPath
         17   10 00003F90 RGSSGetStringACP
         18   11 00003F30 RGSSGetStringUTF8
         19   12 00003C60 RGSSGetTable
         20   13 00003AF0 RGSSInitialize
         21   14 000040B0 RGSSSetString
         22   15 000041F0 RGSSSetStringACP
         23   16 00004150 RGSSSetStringUTF8
         24   17 00004320 RGSSSetupRTP
         25   18 0011F150 RegDefaultSyntax
         26   19 0011F5D8 RegEncodingASCII
         27   1A 00121020 RegEncodingEUC_JP
         28   1B 00121168 RegEncodingSJIS
         29   1C 00120ED8 RegEncodingUTF8
         30   1D 0011F140 RegSyntaxRuby
         31   1E 00064900 enc_get_left_adjust_char_head
         32   1F 00064860 enc_get_prev_char_head
         33   20 000647E0 enc_get_right_adjust_char_head
         34   21 0006F030 re_alloc_pattern
         35   22 00063BC0 regex_end
         36   23 00064E30 regex_error_code_to_str
         37   24 0005EB10 regex_foreach_name
         38   25 00063AB0 regex_free
         39   26 00064790 regex_get_encoding
         40   27 000647A0 regex_get_options
         41   28 000647B0 regex_get_syntax
         42   29 0006A900 regex_init
         43   2A 0006D450 regex_match
         44   2B 0005EBD0 regex_name_to_backref_number
         45   2C 0005EB80 regex_name_to_group_numbers
         46   2D 0006EF70 regex_new
         47   2E 0005EB60 regex_number_of_names
         48   2F 0006F050 regex_recompile
         49   30 00063CD0 regex_region_clear
         50   31 00063F10 regex_region_copy
         51   32 00063EC0 regex_region_free
         52   33 00063EB0 regex_region_new
         53   34 00063D10 regex_region_resize
         54   35 0006D920 regex_search
         55   36 0005E6D0 regex_set_verb_warn_func
         56   37 0005E6C0 regex_set_warn_func
         57   38 000647C0 regex_version
         58   39 000649B0 ruby_re_adjust_startpos
         59   3A 0006EFE0 ruby_re_compile_pattern
         60   3B 00064A00 ruby_re_free_pattern
         61   3C 000649A0 ruby_re_free_registers
         62   3D 0006DF30 ruby_re_match
         63   3E 00064A20 ruby_re_mbcinit
         64   3F 0006F0B0 ruby_re_recompile_pattern
         65   40 0006DF60 ruby_re_search
         66   41 00064A10 ruby_re_set_casetable

大量的 Ruby API 都没有导出。之前夏娜那个使得 require so 库成为可能的工程,实际上就是通过反汇编给这个 DLL 打的补丁,把 Ruby 原有的 API 重新导出。

这个config文件不存在,何解?

config.h 是 GNU 的 autoconf 自动生成的配置文件。在类 Un*x 环境下,./config 就是 autoconf 工具链的入口点执行脚本,该脚本会根据当前系统环境生成 config.h 及 Makefile,之后用户便可以通过 gmake 等工具进行 build。我之前建议的是,不理会 autoconf,直接提取你需要的宏、类型声明、函数原型,但如果遇到如下般的根据 autoconf 配置的环境而变化的定义:

  1. #if defined?(_WIN32)
  2. # ...
  3. #elsif defined?(_POSIX_VERSION)
  4. # ...
  5. #end
复制代码
或是:

  1. #if defined?(HAS_LONG_LONG)
  2. # ...
  3. #end

  4. #if defined?(HAS_UINTPTR)
  5. # ...
  6. #end
复制代码
则直接选择符合你环境的定义。你在 Win32 环境,故选择 _WIN32 分歧下的定义;你用 VS2010,支持 uintptr_t,故选择 HAS_UINTPTR 分歧下的定义。

装两个Ruby1.9.2怎么分开gem……

Ruby 目录下有专门放 Ruby 扩展的子目录。
作者: yangff    时间: 2011-9-24 00:09
苏小脉 发表于 2011-9-24 00:03
你查看一下 RGSS????.dll 的导出表就知道了,除了几个正则表达式引擎的抽象接口之外,就只剩下 RM 的高层 ...

那那一坨乱七八糟的错误是咋回事……
作者: 苏小脉    时间: 2011-9-24 01:39
yangff 发表于 2011-9-24 00:09
那那一坨乱七八糟的错误是咋回事……

在你当前的编译单元中有相同签名但返回类型不同的函数声明,这多半是命名冲突的问题。ruby.h 中的名字污染相当严重。这也是为什么我建议从中提取需要的。

另外为什么我的Rm的导出表有100多个东西……  

可能是版本差异,但横竖 Ruby 的 API 绝不止"100多个"。

RGE好像没有改什么啊……

本来也没什么要改的,RGE 只是提取,兼容。
作者: yangff    时间: 2011-9-24 01:52
苏小脉 发表于 2011-9-24 01:39
在你当前的编译单元中有相同签名但返回类型不同的函数声明,这多半是命名冲突的问题。ruby.h 中的名字污 ...

可是Ruby的include里面根本没有include winsock2.h……我也没引用……吧……难道windows.h自带??
RGE也没看到提取什么吧……
作者: 苏小脉    时间: 2011-9-24 02:38
yangff 发表于 2011-9-24 01:52
可是Ruby的include里面根本没有include winsock2.h……我也没引用……吧……难道windows.h自带??
RGE也 ...

ruby.h 没有引用,不代表 ruby.h 引用的 *.h 没有引用。

RGE也没看到提取什么吧……

看来最后还是非得把文件名一一给你耳。
Common/RubyDefineV186.h
Common/RubyDefineV191.h
Common/RubyDefineVXXX.h
Common/IRgeRubyAbstractLayer.h
RgeCore/Source/RubyAbstractLayer.h
RgeCore/Source/RubyAbstractLayer.cpp
作者: yangff    时间: 2011-9-24 10:03
本帖最后由 yangff 于 2011-9-24 10:12 编辑
苏小脉 发表于 2011-9-24 02:38
ruby.h 没有引用,不代表 ruby.h 引用的 *.h 没有引用。


http://ondineyuga.com/svn/RGE2/RubyGameEngine2nd/Common/
http://ondineyuga.com/svn/RGE2/RubyGameEngine2nd/RGE2Core/Source/
http://ondineyuga.com/svn/RGE2/R ... y-1.9.1/ruby/ruby.h
http://ondineyuga.com/svn/RGE2/R ... re/Source/Entry.cpp
  1. #include "ruby.h"
  2. #include "RgeSystem.h"
复制代码
这并没有什么不同啊……难道1.9.1可以,1.9.2就不行?
作者: 苏小脉    时间: 2011-9-24 10:24
yangff 发表于 2011-9-24 10:03
http://ondineyuga.com/svn/RGE2/RubyGameEngine2nd/Common/
http://ondineyuga.com/svn/RGE2/RubyGameEn ...

这个不是 RGE2 的主 repo,我没试过,请你看 RGE2 的主干:
/[2011-05-01]Rge2nd
作者: yangff    时间: 2011-9-24 10:25
苏小脉 发表于 2011-9-24 10:24
这个不是 RGE2 的主 repo,我没试过,请你看 RGE2 的主干:
/[2011-05-01]Rge2nd

这个是新的……我记得完成度极低……
作者: 苏小脉    时间: 2011-9-24 10:27
yangff 发表于 2011-9-24 10:25
这个是新的……我记得完成度极低……

Ruby 抽象层早就完成了。
作者: yangff    时间: 2011-9-24 10:28
本帖最后由 yangff 于 2011-9-24 10:30 编辑
苏小脉 发表于 2011-9-24 10:27
Ruby 抽象层早就完成了。


virtual VALUE                                        GetCObject() const                                                                                                                                { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_cObject"); }
                virtual VALUE                                        GetCClass() const                                                                                                                                { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_cClass"); }
                virtual VALUE                                        GetCModule() const                                                                                                                                { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_cModule"); }
                virtual VALUE                                        GetCInteger() const                                                                                                                                { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_cInteger"); }
                virtual VALUE                                        GetCNumeric() const                                                                                                                                { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_cNumeric"); }
                virtual VALUE                                        GetMKernel() const                                                                                                                                { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_mKernel"); }
                virtual VALUE                                        GetEException() const                                                                                                                        { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_eException"); }
                virtual VALUE                                        GetESystemExit() const                                                                                                                        { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_eSystemExit"); }
                virtual VALUE                                        GetESyntaxError() const                                                                                                                        { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_eSyntaxError"); }
                virtual VALUE                                        GetENoMemError() const                                                                                                                        { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_eNoMemError"); }
                virtual VALUE                                        GetEArgError() const                                                                                                                        { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_eArgError"); }
                virtual VALUE                                        GetETypeError() const                                                                                                                        { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_eTypeError"); }
                virtual VALUE                                        GetERuntimeError() const                                                                                                                { return *(VALUE*)::GetProcAddress(m_hRubyCore, "rb_eRuntimeError"); }
这……你不会说要这样实现吧……
这种写法大概是考虑的版本兼容性的说,似乎是支持191和187两个版本
没有比较正常的使用方法么……
作者: 苏小脉    时间: 2011-9-24 10:37
本帖最后由 苏小脉 于 2011-9-24 10:40 编辑
yangff 发表于 2011-9-24 10:28
virtual VALUE                                        GetCObject() const                                                                                                                                { return *(VALUE*)::GetProcAddress(m_hRubyCore ...


唉,突然感觉我前几篇帖子都白费功夫了。重点是:
Common/RubyDefineV186.h
Common/RubyDefineV191.h
Common/RubyDefineVXXX.h
这三个文件。这是你需要关心的如何提取的问题。之所以也列出
Common/IRgeRubyAbstractLayer.h
RgeCore/Source/RubyAbstractLayer.h
RgeCore/Source/RubyAbstractLayer.cpp
这三个是为了让你看到前面三个头中提取出来的宏、类型声明和接口雏形在 RGE 中的具体用例及 RGE 核心在底层是如何寻址到 rb_* 这些 API 函数的。

如果你说的“正常”是指不用 GetProcAddress,那你链接到 Ruby 的 .lib 文件就行了,至于头文件的提取部分仍然是相同的。
作者: yangff    时间: 2011-9-24 10:44
苏小脉 发表于 2011-9-24 10:37
唉,突然感觉我前几篇帖子都白费功夫了。重点是:
Common/RubyDefineV186.h
Common/RubyDefineV191.h

汗……这个我是知道啊。问题时RGE的实现太蛋疼了,居然是用GetProcAddress实现的……正常来讲是不需要的啊。
至于RubyDefineV[abc]这三个文件是把RUBY191和Ruby186的常量分开定义的两个文件吧,里面没有什么东西啊,我关注的是它怎么调用Ruby C API的没想到居然是用GetProcAddress。但是我记得是可以直接用h+lib来调用的,我的192的 ruby.h不能用,我刚才试了下 夏娜的Ruby191的include(也就是原来RGE的 )貌似又没问题真纠结。。
作者: 苏小脉    时间: 2011-9-24 11:18
本帖最后由 苏小脉 于 2011-9-24 11:19 编辑
yangff 发表于 2011-9-24 10:44
汗……这个我是知道啊。问题时RGE的实现太蛋疼了,居然是用GetProcAddress实现的……正常来讲是不需要的 ...


之所以用 GetProcAddress 是为了在运行时同时兼容(动态链接)多个版本,如果你静态链接到某个版本的 *.lib 就可能会导致接口不同而产生的兼容问题,再说以默认配置组建后的每个 Ruby 版本生成的 DLL 文件名都不同,静态链接 *.lib 只会将符号转向到一个固定的 *.dll。不理解就用“蛋疼”来形容,未免可笑。

至于RubyDefineV[abc]这三个文件是把RUBY191和Ruby186的常量分开定义的两个文件吧

“这三个文件是……的两个文件”?:L
*186.h 包含的是 Ruby 1.86 特有的定义,*191.h 包含的是 Ruby 1.9.* 特有的定义,*XXX.h 包含的是通用的定义。

里面没有什么东西啊

要是你真的看不见,那我也无法帮你咯。

我关注的是它怎么调用Ruby C API [...]我记得是可以直接用h+lib来调用的

可以,请见二十四楼最后一行。调用 Ruby C API 不是你纠结的问题,你纠结的是如何使得 Ruby 的诸般编译时宏、类型、雏形定义通过,这是一个编译问题,链接问题你可以之后再担心。
作者: yangff    时间: 2011-9-24 11:46
本帖最后由 yangff 于 2011-9-24 20:37 编辑
苏小脉 发表于 2011-9-24 11:18
之所以用 GetProcAddress 是为了在运行时同时兼容(动态链接)多个版本,如果你静态链接到某个版本的 *.l ...


我知道他是用来解决版本兼容的,好吧,我最后还是用了1.9.1的include,这下可以了……是Include的问题无误,反正1.9.1不用提取也能编译……话说我都想直接把我的代码编译到Ruby的解释器里面去了……Cruby真是纠结
还是不行#¥……¥%……%T¥%
作者: 苏小脉    时间: 2011-9-24 22:19
yangff 发表于 2011-9-24 11:46
我知道他是用来解决版本兼容的,好吧,我最后还是用了1.9.1的include,这下可以了……是Include的问题无 ...

1.9.1 的 *.h 照样用 autoconf,你不用或者不绕过 autoconf 又岂能“可以了”?

58        IntelliSense: more than one instance of overloaded function "FreeAddrInfoExW" has 'C' linkage        c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ws2tcpip.h        378        1         诡异……

这个看起来像是一个老问题:
winsock2.h 必须在 Windows.h 之前包含。很多时候一个工程能否编译成功取决于一些预编译宏的操纵,这往往被视为一种 hack,CRuby 只怕就有这样的问题。你要是执意要用 Ruby 原有的头文件,那就只好去读用于 MSVC 编译的那个 batch 脚本,看它是如何组建工程的了。
作者: 亿万星辰    时间: 2011-9-24 22:43
高端版聊帖,外行表示完全看不懂……
作者: yangff    时间: 2011-9-24 23:02
本帖最后由 yangff 于 2011-9-24 23:03 编辑
苏小脉 发表于 2011-9-24 22:19
1.9.1 的 *.h 照样用 autoconf,你不用或者不绕过 autoconf 又岂能“可以了”?


啊啊啊啊果然啊!!!太感谢了!!!
把Ruby.h放到windows.h前面就好了……




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1