VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1173|回复: 1

[原创] 使用嵌入式脚本mruby访问cctry主页

[复制链接]
78_avatar_middle
在线会员 发表于 2015-11-17 18:49:16 | 显示全部楼层 |阅读模式
本帖最后由 pynix 于 2015-11-17 19:05 编辑

使用嵌入式脚本mruby访问cctry主页  看到标题你们知道的,我来安利ruby了。不过今天安利的是ruby的嵌入式版本mruby。

主页: http://www.mruby.org/

这次打算使用mruby-curl库来做http客户端,所以先要编译libcurl,论坛貌似有人用过,官方网站的下载地址被墙了,翻墙出去下载过来的是动态链接库版本,不过为了方便使用需要编译静态库版本,只能下载源码编译。我下载的是7.45版本。

解压,进入winbuild目录,里面的BUILD.WINDOWS.txt是详细的针对windows平台的编译说明。

我的编译参数:
  1. nmake /f Makefile.vc mode=static DEBUG=no
复制代码


还有一些选项可选,比如禁用ipv6等。

编译完成后在builds目录下libcurl-vc-x86-release-static-ipv6-sspi-winssl就是你需要的,copy出去就行,里面还有一个可执行文件,可以先测试看看。

  1. Downloads\curl-7.45.0\builds\libcurl-vc-x86-release-static-ipv6-sspi-winssl\bin>curl baidu.com
复制代码

  1. <html>
  2. <meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
  3. </html>
复制代码


OK


到官网下载mruby最新稳定版(目前1.1.0)

muruby构建用的是ruby版的make,所以你需要安装ruby,到http://rubyinstaller.org/下载安装,完成后添加的PATH,在命令行下构建

  1. rake
复制代码

  1. balabala......
复制代码


完成后在bin目录下生成一堆可执行文件,运行mirb可以输入ruby命令。

  1. mirb - Embeddable Interactive Ruby Shell

  2. > puts 'hello cctry'
  3. hello cctry
  4. => nil
  5. >
复制代码


PS: 构建的时候需要bison生成语法解析器,我因为安装过msys2,所以直接通过,如果编译出错需要下载windows专用的bison添加的PATH。


现在mruby仅仅是一个核心,没有扩展库什么都不能干,我们添加mruby-curl。

到http://www.mruby.org/libraries/搜索mruby-curl,点击链接到github,按照README安装。

很简单,只是在build_config.rb中加入一句

  1. conf.gem :github => 'mattn/mruby-curl'
复制代码


不过由于这个库以来http parser所以还需要加入mruby-http

  1. conf.gem :github => 'mattn/mruby-http'
复制代码




在mruby目录下新建third_party,把刚才编译的libcurl库copy进去。

在build_config.rb中加入一下代码将第三方库的头文件和库文件加入编译选项。

  1. third_party = File.join(File.dirname(__FILE__),'third_party')
  2.   Dir.foreach(third_party) do |lib|
  3.     inc_path = File.expand_path File.join('third_party',lib,'include')
  4.     lib_path = File.expand_path File.join('third_party',lib,'lib')
  5.     conf.cc.include_paths << inc_path
  6.     conf.linker.library_paths << lib_path
  7.   end
复制代码


现在build_config.rb看起来是这个样子的,多余的暂时删掉。

  1. MRuby::Build.new do |conf|
  2.   
  3.   if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR']
  4.     toolchain :visualcpp
  5.   else
  6.     toolchain :gcc
  7.   end

  8.   enable_debug

  9.   conf.gem :github => 'mattn/mruby-http'
  10.   conf.gem :github => 'mattn/mruby-curl'

  11.   third_party = File.join(File.dirname(__FILE__),'third_party')
  12.   Dir.foreach(third_party) do |lib|
  13.     inc_path = File.expand_path File.join('third_party',lib,'include')
  14.     lib_path = File.expand_path File.join('third_party',lib,'lib')
  15.     conf.cc.include_paths << inc_path
  16.     conf.linker.library_paths << lib_path
  17.   end

  18.   conf.gembox 'default'

  19.   
  20. end

复制代码



OK,rake。

PS: 构建过程中需要git,当然也可以直接下载库然后指定目录。


折腾这么久我以为编译成功,然而并没有。

  1. LINK : fatal error LNK1181: cannot open input file 'curl.lib'
复制代码


找不到库文件,这里可以修改库文件名,可以修改编译选项。

因为这个库原本是绑定动态的libcurl的,所以也需要修改一些编译选项,所以就统一的修改编译选项。

cd build\mrbgems\mruby-curl,修改mrbgem.rake

  1. spec.linker.libraries << 'libcurl_a'
复制代码


加入

  1. spec.cc.defines << 'CURL_STATICLIB'
复制代码



现在mrbgem.rake是这个样子的

  1. MRuby::Gem::Specification.new('mruby-curl') do |spec|
  2.   spec.license = 'MIT'
  3.   spec.authors = 'mattn'

  4.   spec.cc.defines << 'CURL_STATICLIB'
  5.   spec.linker.libraries << 'libcurl_a'
  6. end
复制代码


rake clean&&rake

OK


构建完成后再次打开mirb

  1. mirb - Embeddable Interactive Ruby Shell

  2. > puts Curl::get("https://www.cctry.com").body

  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml">
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
  7. <title>VC驿站-C语言 C++ 编程学习交流论坛 </title>

  8. <meta name="keywords" content="C语言,C++,VC,编程,学习资料,教程,论坛" />
复制代码



看到屏幕哗哗往下滚动,那么恭喜你,成功了。



看似完了,不过我们使用的时候不可能去输入ruby命令,我们需要预先写好,所以我们来构建一个嵌入mruby的c程序。


从mrbgems目录下copy mruby-bin-mirb到上一级目录,修改为mruby-bin-app并进入。

修改mrbgem.rake 如下:

  1. MRuby::Gem::Specification.new('mruby-bin-app') do |spec|
  2.   spec.license = 'MIT'
  3.   spec.author  = 'mruby developers'

  4.   spec.bins = %w(app)
  5. end
复制代码


tools目录下新建app目录,里面新建app.c 内容如下:

  1. #include "mruby.h"
  2. #include "mruby/compile.h"

  3. int
  4. main(void)
  5. {
  6.   mrb_state *mrb = mrb_open();
  7.   if (!mrb) { /* handle error */
  8.     printf("could not initialize mruby\n");
  9.     return 1;
  10.   }
  11.   mrb_load_string(mrb, "App::app");
  12.   mrb_close(mrb);
  13.   return 0;
  14. }
复制代码


新建mrblib目录并在目录下新建文件app.rb,内容如下:

  1. module App
  2.   def self.app
  3.         puts Curl::get('https://www.cctry.com').body
  4.   end
  5. end
复制代码


清理无用文件。

在build_config.rb中加入app

  1. conf.gem 'mruby-bin-app'
复制代码



rake clean&&rake


完成后执行bin下的app.exe,看到屏幕往下滚动不断输出字符,OK,再次恭喜你。


bin目录的的文件是静态链接的,可以copy到别的地方执行,而且可执行文件大概700多kb,还是比较袖珍了。

接下来你可以发挥你的想象修改app.rb文件,干点什么事,必要的时候到mruby网站找相应的库。





麻雀虽小,五脏俱全,mruby作为嵌入式脚本语言还是相当值得一试,语法优雅,库相对较全,体积袖珍,看到论坛有编译火狐的js引擎的,不知道编译出来的可执行文件如何。


编译环境:

windows 10 x86
visual studio community edition
msys2
ruby 2.2
rake 10.4.2

工程:
使用嵌入式脚本mruby访问cctry主页 mruby-curl-ccrty.zip (1.31 MB, 下载次数: 0)

评分

参与人数 1威望 +2 驿站币 +3 热心值 +3 收起 理由
51_avatar_small Syc + 2 + 3 + 3 支持原创!

查看全部评分





上一篇:(小鱼)分享PC 微信duilib资源
下一篇:一个简单的截图程序(包含屏幕、窗口、矩形截图)
51_avatar_middle
online_admins 发表于 2015-11-18 13:55:11 | 显示全部楼层
不错,这种语言还真没怎么用过,楼主想法很不错使用嵌入式脚本mruby访问cctry主页
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-6-20 02:17

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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