设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4784|回复: 29
打印 上一主题 下一主题

[有事请教] Ruby1.9.2怎么在MSVC++里面运行?

[复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

跳转到指定楼层
1
发表于 2011-9-21 23:10:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
就是那个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补充以下内容:
如果不行的话我就只能用管道了……
哎呀,蛋疼什么的最有爱了

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

30
 楼主| 发表于 2011-9-24 23:02:59 | 只看该作者
本帖最后由 yangff 于 2011-9-24 23:03 编辑
苏小脉 发表于 2011-9-24 22:19
1.9.1 的 *.h 照样用 autoconf,你不用或者不绕过 autoconf 又岂能“可以了”?


啊啊啊啊果然啊!!!太感谢了!!!
把Ruby.h放到windows.h前面就好了……
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
270
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

29
发表于 2011-9-24 22:43:18 | 只看该作者
高端版聊帖,外行表示完全看不懂……
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
953 小时
注册时间
2007-4-25
帖子
805
28
发表于 2011-9-24 22:19:57 | 只看该作者
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 脚本,看它是如何组建工程的了。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

27
 楼主| 发表于 2011-9-24 11:46:33 | 只看该作者
本帖最后由 yangff 于 2011-9-24 20:37 编辑
苏小脉 发表于 2011-9-24 11:18
之所以用 GetProcAddress 是为了在运行时同时兼容(动态链接)多个版本,如果你静态链接到某个版本的 *.l ...


我知道他是用来解决版本兼容的,好吧,我最后还是用了1.9.1的include,这下可以了……是Include的问题无误,反正1.9.1不用提取也能编译……话说我都想直接把我的代码编译到Ruby的解释器里面去了……Cruby真是纠结
还是不行#¥……¥%……%T¥%
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
953 小时
注册时间
2007-4-25
帖子
805
26
发表于 2011-9-24 11:18:46 | 只看该作者
本帖最后由 苏小脉 于 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 的诸般编译时宏、类型、雏形定义通过,这是一个编译问题,链接问题你可以之后再担心。

点评

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 诡异……   发表于 2011-9-24 20:13
还是那些错误……我又把Ruby的h翻了一遍没有被污染的说……  发表于 2011-9-24 20:13
不对,还是不行!win32里面定义了一坨的类对吧,里面有个关于socket的定义……引用了ws2tcpip还有winsock2结果就挂了……完全不知道原因……蛋疼  发表于 2011-9-24 20:12
于是用1.9.1的include完美解决……果然是Ruby的问题么……  发表于 2011-9-24 11:44

评分

参与人数 1星屑 +300 收起 理由
yangff + 300 thx。。

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

25
 楼主| 发表于 2011-9-24 10:44:09 | 只看该作者
苏小脉 发表于 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的 )貌似又没问题真纠结。。
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
953 小时
注册时间
2007-4-25
帖子
805
24
发表于 2011-9-24 10:37:13 | 只看该作者
本帖最后由 苏小脉 于 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 文件就行了,至于头文件的提取部分仍然是相同的。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

23
 楼主| 发表于 2011-9-24 10:28:42 | 只看该作者
本帖最后由 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两个版本
没有比较正常的使用方法么……
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
120
在线时间
953 小时
注册时间
2007-4-25
帖子
805
22
发表于 2011-9-24 10:27:10 | 只看该作者
yangff 发表于 2011-9-24 10:25
这个是新的……我记得完成度极低……

Ruby 抽象层早就完成了。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-7-20 08:35

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表