VS2010 编译 SpiderMonkey 1.8.5 静态库版本
大家好,前段时间看到 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 文件顶部加上如下代码:
- #include <jsapi.h>
- #pragma comment(lib, "./js185_static/lib/js_static.lib")
复制代码
⑤、添加测试代码,测试 spidermonkey 功能是否正常:
- static JSClass global_class = {
- "global", JSCLASS_GLOBAL_FLAGS,
- JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
- JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
- JSCLASS_NO_OPTIONAL_MEMBERS
- };
- void report_error(JSContext *cx, const char *message, JSErrorReport *report)
- {
- fprintf(stderr, "%s:%u:%s\n",
- report->filename ? report->filename : "<no filename>",
- (unsigned int) report->lineno,
- message);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- JSRuntime *runtime = NULL;
- JSContext *context = NULL;
- JSObject *global = NULL;
- //创建新的运行时8M
- runtime = JS_NewRuntime(8L * 1024L * 1024L);
- if (runtime == NULL) return -1;
- //创建新的上下文
- context = JS_NewContext(runtime, 8*1024);
- if (context == NULL) return -1;
- JS_SetOptions(context, JSOPTION_VAROBJFIX);
- JS_SetErrorReporter(context, report_error);
- //创建一个新的JavaScript对象
- global = JS_NewCompartmentAndGlobalObject(context, &global_class, NULL);
- if (global == NULL) return -1;
- //实例化global, 加入对象,数组等支持
- if (!JS_InitStandardClasses(context, global)) return -1;
- // 使用 global, context 等来完成其他操作,用户定制代码由此开始
- jsval rval;
- char *script = "(function(a, b){return a * b;})(15, 6);";
- JSBool status = JS_EvaluateScript(context, global, script, strlen(script), NULL, 0, &rval);
- if (status == JS_TRUE){
- jsdouble d;
- JS_ValueToNumber(context, rval, &d);
- printf("eval result = %f\n", d);
- }
- JS_DestroyContext(context); //释放上下文对象
- JS_DestroyRuntime(runtime); //释放运行时环境
- JS_ShutDown(); //停止JS虚拟机
- return 0;
- }
复制代码
编译执行,结果链接的过程中出现问题了,如下图:
好吧,说我没定义,我就定义,当前是Windows系统,所以,我在 #include <jsapi.h> 的上面加上:
- #define XP_WIN
复制代码
一编译,结果又报了一堆链接错误,如下图:
这就是关键了,网上很多文章都没介绍这个,经我的一番搜索,靠我的生平所学,终于找到了,再加上个宏定义,如下:
- #define STATIC_JS_API
复制代码
加上之后,还好,链接错误少了很多,不过又有这个链接错误,如下图:
还好,timeEndPeriod 和 timeBeginPeriod 两个函数是系统函数,经过查询MSDN,得知这两个函数的 lib 库是:Winmm.lib,于是加上这句代码:
- #pragma comment(lib, "Winmm.lib")
复制代码
至此,问题终于全部解决了,如下图:
执行结果如下:
好了。。。文章到这里就结束了,希望对大家有帮助,编译好的相关库都给大家打包了,工程也打包了,在下面的附件中!
VS2010 编译 SpiderMonkey 1.8.5 静态库版本相关推荐
- libcurl-windows下静态库版本的编译-编译和调用非常顺利
1.编译之前先看一下基本准则:调用程序和库要尽量在以前几个方面相同: (1).两者的字符集要相同: (2).两者的平台工具集要相同: (3).两者debug/release版本和编译平台位数要一致: ...
- C程序编译过程及常见选项--静态库和动态库
C程序编译过程及常见选项--静态库和动态库 前言 一.gcc详讲 1.1 编译过程 1.2 预处理 1.3 编译(Compilation) 1.4 汇编(Assembly) 1.5 链接(Linkin ...
- [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)
本文转自:http://kb.cnblogs.com/page/94467/ Openssl是个为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法.常用的密钥和证书封装管理功能以及SS ...
- vs2012编译使用lua 5.2静态库
1.在官方网站下载Lua最新代码 http://www.lua.org/download.html 2.打开vs2012新建空白工程Test 3.在解决方案中添加新的lib工程(WIN32->选 ...
- 使用CMake编译freeglut-3.0.0的静态库
之前写了为了编译此库自己搭工程,有读者抱怨这个库,说作者没有提供现成的工程,自己搭工程太麻烦.而咱在linux下尝试编译,发现没有configure文件,所以就按照作者推荐的CMake来制作Makef ...
- 编译c语言动态库,使用gcc、g++编译C/C++源程序,静态库和动态库创建方式
后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序: 后缀为.cpp的,两者都会认为是c++程序. 注意,虽然c++是c的超集,但是两者对语法的要求是有区别的. 编译阶段,g++会调用gc ...
- 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 ...
- VS2010,C++ 制作静态库(*.lib),并使用
VS2010,C++ 制作静态库(*.lib),并使用 原文链接:https://blog.csdn.net/qq_41472037/article/details/100001322 简单来说,就是 ...
- linux中查询动态库版本的命令,linux 程序、动态库、静态库内部添加版本号和编译时间详解...
给程序和库添加版本号和库,有利于维护和升级. 当然你可以在文件名上体现,比如有个程序叫 yun,文件名写为 yun_1.0.2,但这个需要每次手动维护,而且不能100%确保当前程序就是那个版本.所以, ...
最新文章
- python uwsgi_python Web开发你要理解的WSGI uwsgi详解
- 文本分类step by step(二)
- Web/app端自动化测试对比
- 160329(二)、web.xml配置详解
- hot编码 字符one_Python机器学习:特征编码的两种方式
- 算法入门篇四 桶排序
- 数据管理技术的发展过程
- Javascript实现页面跳转传值示例Demo
- 自己动手写Docker系列 -- 3.1构造实现run命令版本的容器
- 从Helm仓库创建应用流程示例
- Milvus加入LF AI孵化,立志成为最流行的AI数据平台
- 博文视点大讲堂 37 期——It's Android Time :程序员创富有道!圆满结束
- 阶段3 2.Spring_10.Spring中事务控制_11 spring5新特性的介绍
- 产品读书《大败局 I》 《大败局II》
- 与计算机相关活动主题,计算机文化节活动策划书
- 实际BCI应用:异步EEG/EOG BCI手抓取和释放的可行性
- 21.pgsql中的执行计划explain
- printf中连续输出i++,--i,++i,i--的值如何
- vbs整人代码大集合(多年以来的整合)
- 163邮箱 提示xm002 NO SELECT Unsafe Login. Please contact kefu@188.com for help
热门文章
- 双系统卸载深度linux系统,双系统卸载linux
- 缺少msvcr100.dll的解决方法
- 为什么选择Milogs客户管理系统-销售日志软件?
- SSM实现文件的上传和下载
- Ziperello汉化版下载
- 前端开发工程师——面试题总结
- Windows 同时开启核心显卡与独立显卡(不接显示器启动核芯显卡)
- 2021年全国规模以上工业企业运行现状分析:实现利润总额87092.1亿元 两年平均增长18.2% [图]
- sketch创建组建
- ladp3 获取属性_Ldap3 库使用方法(三)