大家好,前段时间看到 VC驿站 上面会员发布了一篇文章《Windows系统编译制作SpiderMonkey最新版mozjs-31.2.0版本》,地址为: http://www.cctry.com/thread-250698-1-1.html
过程写的很详细,使用的也是目前来说SpiderMonkey的最新版本31.2.0,不过我之前用的一直是1.8.5版本,用老的版本编译出来的SpiderMonkey库也比较小,我喜欢,哈哈!
于是,自己动手再次编译一下,因为总带着个共享版DLL也麻烦,所以,今天准备直接编译个SpiderMonkey的 静态库lib版本 ,这样调用起来就方便啦,哈哈!

开始动手。。。

1、下载工具包组件及源码:
①、SpiderMonkey1.8.5 源码: http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz
②、MozillaBuild 1.6 组件: https://ftp.mozilla.org/pub/mozi ... aBuildSetup-1.6.exe
③、NPSR 4.8.9 源码: http://ftp.mozilla.org/pub/mozil ... c/nspr-4.8.9.tar.gz

为防止连接失效,特传到网盘一份,地址:
链接:  http://pan.baidu.com/s/1gdITf9p  密码: fikp

2、解压:
解压 SpiderMonkey1.8.5 源码包 js185-1.0.0.tar.gz 到 H:\spider 目录下,实际路径为:H:\spider\js-1.8.5
解压 MozillaBuild 1.6 组件 MozillaBuildSetup-1.6.exe 到 H:\spider 目录下,实际路径为:H:\spider\mozilla-build
解压 NPSR 4.8.9 源码包 nspr-4.8.9.tar.gz 到 H:\spider 目录下,实际路径为:H:\spider\nspr-4.8.9

如下图:

备注:这里的 H 盘可以为任何盘符,spider也只是一个文件夹的名字,可以任意指定,只要保证 js-1.8.5、mozilla-build、nspr-4.8.9 在同一目录下即可,这样方便切换和管理。

3、启动编译环境:
启动CMD命令行窗口,并切换到 mozilla-build 目录下,按照您当前系统安装的vs版本,启动相应的bat文件,我当前电脑上装的是 vs2010,所以,我启动的是 start-msvc10.bat 脚本,如下图:

备注:这是一个类似Unix的命令行。目录名都要用反斜杠 /,驱动器也是当作一目录。例如,要进入H 盘根目录下的 spider 目录,就要执行cd /h/spider

//
// 备注:本篇文章来自 vc驿站: http://www.cctry.com/thread-252599-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//

4、编译:

①、编译 NPSR 4.8.9 非调试 Release 版本库:

切换路径到 H:\spider\nspr-4.8.9 下,一条一条以此执行以下命令:
cd /h/spider/nspr-4.8.9
mkdir Release
cd Release
../mozilla/nsprpub/configure --disable-debug --enable-optimize --enable-win32-target=WIN95
make

即可完成 NPSR 4.8.9 非调试 Release 版本库的编译。执行过程比较慢,会用几分钟的时间。。。

相关截图如下:

②、编译 SpiderMonkey1.8.5 非调试 Release 版本库:

切换路径到 H:\spider\js-1.8.5\js\src 下,一条一条以此执行以下命令:
cd /h/spider/js-1.8.5/js/src
autoconf-2.13
mkdir Release
cd Release
../configure --enable-static --disable-shared-js --enable-optimize --enable-win32-target=WIN95
make

即可完成 SpiderMonkey1.8.5 非调试 Release 版本库的编译。执行过程比较慢,会用几分钟的时间。。。

备注:默认 SpiderMonkey 是使用 MD 来编译的,如果想使用 MT 请在执行 autoconf-2.13 命令之前修改:src\confg 目录下的 config.mk 文件,把 -MD 改成 -MT。

相关截图如下:

编译完成之后,大家就可以在 H:\spider\js-1.8.5\js\src\Release\dist 路径下找到 SpiderMonkey1.8.5 的编译出来的文件了。

我们真正要的只有两个目录的文件:
include 目录下有很多头文件,是用作其他工程包含的头文件;
lib         目录下有一个静态库文件 js_static.lib,这个静态库就是我们要的,看下个头,15M左右,嘿,个头真不小,基本功能应该都在里面了

//
// 备注:本篇文章来自 vc驿站: http://www.cctry.com/thread-252599-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//

5、使用:
原本使用步骤不想写了,但是在使用过程中还真遇到问题了,于是就写出来吧!

①、新建一控制台类型的工程:spTest
②、在 spTest 工程目录下新建一文件夹:js185_static,将 H:\spider\js-1.8.5\js\src\Release\dist 路径下的 include、lib 两个目录拷贝到 js185_static 目录下;
③、将 js185_static/include 添加到 spTest 工程设置的 include 下面,如下图:

④、在 spTest.cpp 文件顶部加上如下代码:

  1. #include <jsapi.h>
  2. #pragma comment(lib, "./js185_static/lib/js_static.lib")

复制代码

⑤、添加测试代码,测试 spidermonkey 功能是否正常:

  1. static JSClass global_class = {
  2. "global", JSCLASS_GLOBAL_FLAGS,
  3. JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
  4. JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
  5. JSCLASS_NO_OPTIONAL_MEMBERS
  6. };
  7. void report_error(JSContext *cx,  const char *message, JSErrorReport *report)
  8. {
  9. fprintf(stderr, "%s:%u:%s\n",
  10. report->filename ? report->filename : "<no filename>",
  11. (unsigned int) report->lineno,
  12. message);
  13. }
  14. int _tmain(int argc, _TCHAR* argv[])
  15. {
  16. JSRuntime *runtime = NULL;
  17. JSContext *context = NULL;
  18. JSObject *global = NULL;
  19. //创建新的运行时8M
  20. runtime = JS_NewRuntime(8L * 1024L * 1024L);
  21. if (runtime == NULL) return -1;
  22. //创建新的上下文
  23. context = JS_NewContext(runtime, 8*1024);
  24. if (context == NULL) return -1;
  25. JS_SetOptions(context, JSOPTION_VAROBJFIX);
  26. JS_SetErrorReporter(context, report_error);
  27. //创建一个新的JavaScript对象
  28. global = JS_NewCompartmentAndGlobalObject(context, &global_class, NULL);
  29. if (global == NULL) return -1;
  30. //实例化global, 加入对象,数组等支持
  31. if (!JS_InitStandardClasses(context, global)) return -1;
  32. // 使用 global, context 等来完成其他操作,用户定制代码由此开始
  33. jsval rval;
  34. char *script = "(function(a, b){return a * b;})(15, 6);";
  35. JSBool status = JS_EvaluateScript(context, global, script, strlen(script), NULL, 0, &rval);
  36. if (status == JS_TRUE){
  37. jsdouble d;
  38. JS_ValueToNumber(context, rval, &d);
  39. printf("eval result = %f\n", d);
  40. }
  41. JS_DestroyContext(context); //释放上下文对象
  42. JS_DestroyRuntime(runtime); //释放运行时环境
  43. JS_ShutDown(); //停止JS虚拟机
  44. return 0;
  45. }

复制代码

编译执行,结果链接的过程中出现问题了,如下图:

好吧,说我没定义,我就定义,当前是Windows系统,所以,我在 #include <jsapi.h> 的上面加上:

  1. #define XP_WIN

复制代码

一编译,结果又报了一堆链接错误,如下图:

这就是关键了,网上很多文章都没介绍这个,经我的一番搜索,靠我的生平所学,终于找到了,再加上个宏定义,如下:

  1. #define STATIC_JS_API

复制代码

加上之后,还好,链接错误少了很多,不过又有这个链接错误,如下图:

还好,timeEndPeriod 和 timeBeginPeriod 两个函数是系统函数,经过查询MSDN,得知这两个函数的 lib 库是:Winmm.lib,于是加上这句代码:

  1. #pragma comment(lib, "Winmm.lib")

复制代码

至此,问题终于全部解决了,如下图:

执行结果如下:

好了。。。文章到这里就结束了,希望对大家有帮助,编译好的相关库都给大家打包了,工程也打包了,在下面的附件中!

VS2010 编译 SpiderMonkey 1.8.5 静态库版本相关推荐

  1. libcurl-windows下静态库版本的编译-编译和调用非常顺利

    1.编译之前先看一下基本准则:调用程序和库要尽量在以前几个方面相同: (1).两者的字符集要相同: (2).两者的平台工具集要相同: (3).两者debug/release版本和编译平台位数要一致: ...

  2. C程序编译过程及常见选项--静态库和动态库

    C程序编译过程及常见选项--静态库和动态库 前言 一.gcc详讲 1.1 编译过程 1.2 预处理 1.3 编译(Compilation) 1.4 汇编(Assembly) 1.5 链接(Linkin ...

  3. [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)

    本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SS ...

  4. vs2012编译使用lua 5.2静态库

    1.在官方网站下载Lua最新代码 http://www.lua.org/download.html 2.打开vs2012新建空白工程Test 3.在解决方案中添加新的lib工程(WIN32->选 ...

  5. 使用CMake编译freeglut-3.0.0的静态库

    之前写了为了编译此库自己搭工程,有读者抱怨这个库,说作者没有提供现成的工程,自己搭工程太麻烦.而咱在linux下尝试编译,发现没有configure文件,所以就按照作者推荐的CMake来制作Makef ...

  6. 编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式

    后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序: 后缀为.cpp的,两者都会认为是c++程序. 注意,虽然c++是c的超集,但是两者对语法的要求是有区别的. 编译阶段,g++会调用gc ...

  7. mac下编译android下libaac,Mac 下编译SOX for android (.a静态库)

    1.下载 sox源码: git clone https://git.code.sf.net/p/sox/code sox-code 3.配置NDK环境变量(如果有不熟悉mac下配置环境变量的请参考Ma ...

  8. VS2010,C++ 制作静态库(*.lib),并使用

    VS2010,C++ 制作静态库(*.lib),并使用 原文链接:https://blog.csdn.net/qq_41472037/article/details/100001322 简单来说,就是 ...

  9. linux中查询动态库版本的命令,linux 程序、动态库、静态库内部添加版本号和编译时间详解...

    给程序和库添加版本号和库,有利于维护和升级. 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2,但这个需要每次手动维护,而且不能100%确保当前程序就是那个版本.所以, ...

最新文章

  1. python uwsgi_python Web开发你要理解的WSGI uwsgi详解
  2. 文本分类step by step(二)
  3. Web/app端自动化测试对比
  4. 160329(二)、web.xml配置详解
  5. hot编码 字符one_Python机器学习:特征编码的两种方式
  6. 算法入门篇四 桶排序
  7. 数据管理技术的发展过程
  8. Javascript实现页面跳转传值示例Demo
  9. 自己动手写Docker系列 -- 3.1构造实现run命令版本的容器
  10. 从Helm仓库创建应用流程示例
  11. Milvus加入LF AI孵化,立志成为最流行的AI数据平台
  12. 博文视点大讲堂 37 期——It's Android Time :程序员创富有道!圆满结束
  13. 阶段3 2.Spring_10.Spring中事务控制_11 spring5新特性的介绍
  14. 产品读书《大败局 I》 《大败局II》
  15. 与计算机相关活动主题,计算机文化节活动策划书
  16. 实际BCI应用:异步EEG/EOG BCI手抓取和释放的可行性
  17. 21.pgsql中的执行计划explain
  18. printf中连续输出i++,--i,++i,i--的值如何
  19. vbs整人代码大集合(多年以来的整合)
  20. 163邮箱 提示xm002 NO SELECT Unsafe Login. Please contact kefu@188.com for help

热门文章

  1. 双系统卸载深度linux系统,双系统卸载linux
  2. 缺少msvcr100.dll的解决方法
  3. 为什么选择Milogs客户管理系统-销售日志软件?
  4. SSM实现文件的上传和下载
  5. Ziperello汉化版下载
  6. 前端开发工程师——面试题总结
  7. Windows 同时开启核心显卡与独立显卡(不接显示器启动核芯显卡)
  8. 2021年全国规模以上工业企业运行现状分析:实现利润总额87092.1亿元 两年平均增长18.2% [图]
  9. sketch创建组建
  10. ladp3 获取属性_Ldap3 库使用方法(三)