1. 准备软件

    python2.7X64安装包; gyp工具包; vs2013;
    python和gyp下载地址:
    链接: https://pan.baidu.com/s/1xXkkYi7HEgaUR_Mm9c_GXg 密码: ddfd

2. 安装python

a.打开安装文件,注意自己的安装包是32位还是64位的.

1
b.注意安装的位置,然后一直下一步下一步,直到结束.
python安装b
c.将刚才的安装位置配置到环境变量中去.
python安装c
d.检查python的安装
python安装d
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项目,弹出菜单中选择"属性"

!
vs1
b.选择”c++目录”,点击面板中”包含目录”右边的小三角,选择”编辑”,弹出的文件选择框中选择erlang安装目录下的/user/include目录
这里写图片描述
vs8
vs9
c.同理,选择”引用目录”,将/user/lib加入进去,点击应用,配置完成.
d.在vs2013中执行编译,弹出什么”无法启动XXX”之类的报错不管,只看最下面的打印,没有失败即可.
vs11
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++==>预编译头==>不使用预编译==>应用

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐