1. 准备软件
python2.7X64安装包; gyp工具包; vs2013;
python和gyp下载地址:
链接: https://pan.baidu.com/s/1xXkkYi7HEgaUR_Mm9c_GXg 密码: ddfd
2. 安装python
a.打开安装文件,注意自己的安装包是32位还是64位的.
![]()
b.注意安装的位置,然后一直下一步下一步,直到结束.
![]()
c.将刚才的安装位置配置到环境变量中去.
![]()
d.检查python的安装
![]()
e.至此,python安装完成,gyp是一个压缩包不需要安装,vs2013的安装请自行百度.
3. 编写gyp编译脚本(以jiffy为例)
a.新建文本jiffy.def
EXPORTS
start_monitor
remove_dir
add_dir
stop_monitor
b. 新建jiffy.gyp文件
{
'targets': [
{
'target_name': 'alltargets',
'type': 'none',
'dependencies': [
'jiffy',
],
}
],
}
c.新建jiffy.gypi文件
#该文件指定了lib的配置,c文件,头文件,以及资源文件的位置,请参照自己的项目修改
{
'targets': [
{
'target_name': 'jiffy',
'type': 'shared_library',
'includes': [
'../../tools/gyp/common.gypi',
],
'variables': {
'source_path': '..',
},
'include_dirs': [
'../include/nif_win_32',
'../src',
],
'sources': [
'<(source_path)/src/decoder.c',
'<(source_path)/src/doubles.cc',
'<(source_path)/src/encoder.c',
'<(source_path)/src/jiffy.c',
'<(source_path)/src/jiffy.h',
'<(source_path)/src/utf8.c',
'<(source_path)/src/util.c',
'<(source_path)/src/double-conversion/bignum.h',
'<(source_path)/src/double-conversion/bignum-dtoa.h',
'<(source_path)/src/double-conversion/cached-powers.h',
'<(source_path)/src/double-conversion/diy-fp.h',
'<(source_path)/src/double-conversion/double-conversion.h',
'<(source_path)/src/double-conversion/fast-dtoa.h',
'<(source_path)/src/double-conversion/fixed-dtoa.h',
'<(source_path)/src/double-conversion/ieee.h',
'<(source_path)/src/double-conversion/strtod.h',
'<(source_path)/src/double-conversion/utils.h',
'<(source_path)/src/double-conversion/bignum.cc',
'<(source_path)/src/double-conversion/bignum-dtoa.cc',
'<(source_path)/src/double-conversion/cached-powers.cc',
'<(source_path)/src/double-conversion/diy-fp.cc',
'<(source_path)/src/double-conversion/double-conversion.cc',
'<(source_path)/src/double-conversion/fast-dtoa.cc',
'<(source_path)/src/double-conversion/fixed-dtoa.cc',
'<(source_path)/src/double-conversion/strtod.cc',
],
},
],
}
d.新建bat文件:gyp_build.bat
::编译的时候需要手动选择平台
..\tools\bin\junction -d ..\tools\bin\Debug
..\tools\bin\junction ..\tools\bin\Debug ..\pijs\bin\win
..\tools\bin\junction -d ..\tools\bin\Release
..\tools\bin\junction ..\tools\bin\Release ..\pijs\bin\win
cd gyp
call ..\..\tools\gyp\src\gyp.bat -I jiffy.gypi --depth=. jiffy.gyp --generator-output=../gyp_build -G msvs_version=2013
pause
e.新建文件夹include/nif_win_32,将erlang安装目录user/include下面的文件拷贝进去.最终的目录结构如下
f.执行bat文件,会自动生成一个gyp_build文件夹,双击文件夹中的jiffy.sln,自动打开vs2013.
4. vs2013配置
a.在打开的工程中,右键jiffy项目,弹出菜单中选择"属性"
!
b.选择”c++目录”,点击面板中”包含目录”右边的小三角,选择”编辑”,弹出的文件选择框中选择erlang安装目录下的/user/include目录
c.同理,选择”引用目录”,将/user/lib加入进去,点击应用,配置完成.
d.在vs2013中执行编译,弹出什么”无法启动XXX”之类的报错不管,只看最下面的打印,没有失败即可.
f.根据编译的配置,在tools/bin下面获取对应的dll
5. 打64位dll
打包的时候请先搞清楚自己需要在什么ERTS系统中运行,如果是64位的ERTS,那么就必须打64位的dll,否则将出现类似:
{error,{load_failed,”Failed to load NIF library ../nif/jiffy: ‘Unspecified error’”}}
的错误.
a.一样的,在jiffy项目上面右键,选择”属性”,点击右上角的”配置管理器”,选择”活动解决方案平台”,点击黑色三角形,选择”新建”
![]()
b.在弹出框中选择”X64”,成功的话”平台”就变成了X64.
![]()
c.在选择”链接器”==>”高级”==>”目标计算机”,选择X64
![]()
d.清理项目,重新打包,现在获取的就是64位的dll了.
6. 可能遇到的问题
a.操作中遇到的最坑爹的问题就是加载nif报
{error,{load_failed,”Failed to load NIF library ../nif/jiffy: ‘Unspecified error’”}}
错:完全看不错来什么原因.
试过gcc编译,试过直接cl编译,始终都有这个问题.
后来看见一篇博客MinGW(GCC)编译DLL文件,
学着使用python加载dll文件,终于看到了一个有用的提示:
[WinError 193] %1 不是有效的 Win32 应用程序.
百度这个错误,终于有大哥说正确了,32位的dll包拿到64位的系统中跑就报这个错误,使用步骤5中的方法打包,
终于加载成功了,真心不容易啊!
b.错误 1 error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “stdafx.h””? G:\c\erlnif\erlnif\niftest.c 20 1 erlnif
![]()
解决方式:属性==>c/c++==>预编译头==>不使用预编译==>应用