`

【工作点滴】用VS 2010 编译 Ruby 1.9.1

阅读更多
关键字:ruby 1.9.1 Visual studio 2010 MSVC 1600 download compile

VC 2010增加了许多对C99的支持,编译许多GNU的项目会方便许多,考虑到以后编译ruby扩展的方便,所以重新用VC 2010 (1600) 把ruby编译了一遍。

编译Ruby需要一些第三方类库,首先是Zlib,Zlib最新版本是1.2.4,编译很简单,解开之后,nmake -f .\win32\makefile.msc,编译完成之后,得到2个头文件zlib.h和zconf.h和一个library zlib.lib,将他们放到VC的目录(默认是"C:\Program Files\Microsoft Visual Studio 10.0\VC"),这其实是个偷懒的做法--:)

有了Zlib之后,就可以开始ruby的编译工作,最新的ruby版本是ruby-1.9.1-p376,这个版本需要做适当的修改才能被编译,首先要解决的是win32.h里许多errono的重定义问题,VC 1600已经定义了自己的errono,为了兼容之前的VC,打开<ruby-src>\include\ruby下的win32.h,修改成条件编译。
#if _MSC_VER <1600
#define EWOULDBLOCK		WSAEWOULDBLOCK
.....
#define EREMOTE		WSAEREMOTE
#endif


之后运行ruby的命令 .\win32\configure.bat --prefix="C:/ruby",之后如果直接运行nmake,会遇到C1010070 "Failed to load and parse the manifest",这是生成的makefile的bug,增加以下两行

CFLAGS = -nologo -MD $(DEBUGFLAGS) $(OPTFLAGS) $(PROCESSOR_FLAG)
LDFLAGS = $(LDFLAGS) -manifest


继续编译的话,在testThread.c会有个编译错误,将附件中的testThread.c覆盖掉Ruby原来的那个,一切就ok.

编译过程中有一个warning C4273: 'vsnprintf' : inconsistent dll,这个是因为ruby的missing.h,又定义了一个
extern int vsnprintf(char *, size_t n, char const *, va_list);


直接rem掉之后就可以继续下去了。

编译完的ruby之后并不能运行rails,因为有两个重要的lib(iconv和open ssl)没有被编译,会导致rails运行失败。

首先编译iconv,由于后续一些版本的iconv去掉了对VC的支持,所以必须寻找合适的版本,我找到的最高版本是iconv 1.11.1,足够支持rails了,编译命令用
nmake -f makefile.msvc NO_NLS=1
nmake -f makefile.msvc install

NLS是native language support,将得到的头文件和library也放到VC的目录里去。。(又一次坏习惯)。

接下来是可怕的Open SSL,OpenSSL本身对VC支持得很好,问题出在ruby身上,几个作者搞了一整年,还是没办法兼容好Open SSL 0.9和1.0版本,编译的错误多得不计其数,有兴趣你可以参考这些补丁:


    http://redmine.ruby-lang.org/issues/show/2022
    http://redmine.ruby-lang.org/issues/show/814
    http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/39053
    ]http://projects.reductivelabs.com/issues/3363


就是打上这些补丁,也未必能正确运行rails,(比如SSL_SESSION_CMP被OpenSSL修改成private之类的问题) 建议回退到0.9.8,让作者去埋头苦干吧。。。

perl configure VC-WIN32
.\ms\do_ms.bat
nmake -f .\ms\ntdll.mak
nmake -f .\ms\ntdll.mak install


另外还需要把openssl extconf.rb的 if(mingw) 这一行去掉。。。

最后结果:



Ruby的插件的缺点是十分致命的,一旦更换了ruby的运行时,所有的C插件会全部失效,包括sqlite3-ruby之类。

下载sqlite3-ruby,利用下面的方法编译它
lib /def:sqlite3.def /machine:x86

这样可以得到sqlite3.lib,同时从源代码里拿到sqlite3.h,拷贝到某个目录,比如win32中,可以这样放置文件
c:\win32\include\sqlite3.h
c:\win32\lib\sqlite3.lib


这个sqlite3.lib只是sqlite3.dll的wrapper而已,所以要把sqlite3.dll放到路径里的某个目录下,比如C:\WINDOWS或者C:\WINDOWS\SYSTEM32

修改一下sqlite3-ruby的源代码里的extconf.rb,指向我们的目录
require 'mkmf'

SWIG_WRAP = "sqlite3_api_wrap.c"

dir_config( "sqlite3", "c:/win32/include","c:/win32/lib" )

have_library( "rt", "fdatasync" )

if have_header( "sqlite3.h" ) && have_library( "sqlite3", "sqlite3_open" )
  if !File.exists?( SWIG_WRAP ) || with_config( "swig", false )
    puts "creating #{SWIG_WRAP}"
    system "swig -ruby sqlite3_api.i" or raise "could not build wrapper via swig (perhaps swig is not installed?)"
  end

  create_makefile( "sqlite3_api" )
end


然后运行ruby setup.rb,看看最后是不是在rails中正常工作了?




附件里带有有编译后的基于msvcrt10的ruby 1.9.1-P376,不想要重新经历编译的痛苦的同学可以直接下载。

  • 大小: 14.3 KB
  • 大小: 30 KB
分享到:
评论

相关推荐

    Ruby1.9.1released.zip

    ruby 1.9是ruby发展历史上的一个里程碑版本: 1、ruby 1.9首次引入字节码即时编译技术,可以大大提高ruby本身的性能。根据之前的综合评测来看,1.9的性能大约是1.8.6的三倍左右,性能追上了Python。 2、ruby 1.9...

    适合Ruby 1.9.1的Ruby-FCGI源码包

    在Ruby 1.9.1时代,由于语言版本的更新,可能引入了一些不兼容性,导致官方发布的Ruby-FCGI扩展无法直接在该环境下正常工作。这个问题通常体现在编译或运行时出现错误,比如符号查找失败、类型不匹配等。因此,这个...

    ruby1.9.1文档和一本pdf

    Ruby 1.9.1 是 Ruby 语言的一个重要版本,发布于2009年,它带来了许多重要的改进和更新,对于理解这个编程语言的发展历程至关重要。本压缩包包含的资源是关于 Ruby 1.9.1 的文档和一本 PDF 文件,可能是对该版本的...

    VS2010下编译的GDAL1.9.1最新版

    在**Visual Studio 2010 (VS2010)**环境下编译GDAL,主要是为了满足开发者使用新版本IDE的需求,因为VS2010提供了更好的C++支持和调试工具。与VS2008相比,VS2010引入了C++0x标准库的一部分,增强了性能分析和多核...

    VS2017_PCL1.9.1&&VS2019_PCL1.11.1环境配置

    VS2017_PCL1.9.1&&VS2019_PCL1.11.1环境配置,包含以下内容 vs2017环境配置:PCL_1.9.1_debug_x64.props PCL_1.9.1_release_x64.props vs2019环境配置:PCL_1.11.1_debug_x64.props PCL_1.11.1_release_x64.props

    ruby-1.9.1-p0-i386-mswin32.zip

    "ruby-1.9.1-p0-i386-mswin32.zip" 是一个针对Windows操作系统编译的Ruby编程环境的压缩包,发布于2009年6月20日,当时是Ruby 1.9.1版本的最新版。 Ruby 1.9.1是一个重要的版本更新,引入了许多改进和新特性,包括...

    pcl1.9.1 vtk8.1.1 cmake3.14.2 用于win10 64位下,vs2017 qt5.12.6

    在本文中,我们将深入探讨如何在Windows 10 64位系统上,利用Visual Studio 2017、Qt 5.12.6、CMake 3.14.2来配置并使用PCL(Point Cloud Library)1.9.1和VTK(Visualization Toolkit)8.1.1。这两个库在计算机视觉...

    win7+VS2017+PCL1.9.1配置资料.7z

    文件包含以下内容: 测试文件 属性配置表Win7VS2017PCL1.9.1.props rabbit.pcd OpenNI2.dll

    ruby-1.9.1-p0-i386-mswin32.rar

    总之,这个“ruby-1.9.1-p0-i386-mswin32.rar”压缩包提供了一个完整的Ruby环境,适合在Windows 32位系统上进行开发工作,特别是那些需要处理JSON数据的项目。随着Ruby的不断发展,它继续吸引着全球各地的开发者,...

    ruby安装升级及命令自行编译安装非APTGET方式安装升级的办法

    - 配置编译选项:在编译前需确保`/usr/local/ruby-1.9.1`文件夹有适当的权限。执行命令`../configure --prefix=/usr/local/ruby-1.9.1` **步骤三:编译与安装** - 编译源码:执行`make` - 安装编译后的文件:`make...

    windows下安装Ruby 1.9 二进制zip包

    3. 为了确保Ruby的某些功能正常工作,可能还需要安装其他依赖,比如DevKit,它包含了MinGW工具链,允许你在Windows上编译Ruby的C扩展。 4. 配置DevKit,使其指向Ruby的安装位置。这通常涉及创建一个名为`.bat`的...

    mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe

    mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe

    flann-1.9.1.zip

    3. 库文件:编译好的库文件,可以直接链接到项目中使用。 4. 示例和测试:提供示例代码和测试用例,帮助用户理解和使用FLANN的功能。 5. 文档:包括用户手册和API文档,详细介绍了如何安装、配置和使用FLANN。 6. ...

    uaserverc-win32-x86-vs2010sp1-v1.9.1-442.zip

    "uaserverc-win32-x86-vs2010sp1-v1.9.1-442.zip"是一个针对Windows 32位x86架构的服务器软件——UAServerC的特定版本,它基于Microsoft Visual Studio 2010 Service Pack 1 (VS2010SP1)进行编译。这个压缩包不仅...

    jsoncpp-1.9.1_jasoncpp1.9.1_cjson_jsoncpp1.9编译_

    标题"jsoncpp-1.9.1_jasoncpp1.9.1_cjson_jsoncpp1.9编译_"提及的是JSONCPP的一个特定版本——1.9.1,这可能是指用户或开发者正在寻找关于如何编译和使用这个特定版本的JSONCPP库的信息。JSONCPP 1.9.1是该项目在...

    Ruby1.91_Stable和Gem1.3.5

    `ruby-1.9.1-p376.tar.gz` 文件是 Ruby 1.9.1 的源码包,通过以下步骤可以编译安装: 1. **解压**:使用 `tar -zxvf ruby-1.9.1-p376.tar.gz` 解压缩文件。 2. **配置**:进入解压后的目录,运行 `./configure` 脚本...

    Ubuntu Docker 源码编译(1.9.1 )详解

    主要介绍了Ubuntu Docker 源码编译(1.9.1 )详解的相关资料,这里对编译过程进行了详细的分析介绍,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics