使用Qt制作nodejs能用的64位dll

这个需求来自于工作,项目使用nodejs作为后台,然而出于性能考虑,需要使用调用动态库来解析指定设备的交互报文。

过程不再细述,最终的需求是,在windows/linux的64位服务器上,采用nodejs作为后台的项目,需要调用动态库

由于需要跨平台,自然选择了使用Qt来做动态库,虽然我最近才知道VS还有Linux版

1. nodejs仅支持C库而不支持C++库,这个意思并不是库内不能使用C++语法,而是接口是C风格,并且对外暴露的,采用Depends查看接口后,看到接口类型应该是C
qt-64dll.png

这个比较容易解决,将Qt默认定义的以类的形式实现C++库改成接口就行了,无非是对外直接暴露接口,使用全局变量实例化接口类,在接口中直接调用接口的方法,并且在声明时一定要加上extern “C”

extern "C"; FSUSHARED_EXPORT char* dataFormat(char* pData, int iLen);

2. 64位动态库(windows)

也许有人会说32位的东西照样可以用在64位的机器上,不过这个东西一般指的是可执行程序,32位可执行程序当然可以在64位机使用,调用的是32位的动态库,但是64位的可执行程序只能调用64位动态库

这个就比较麻烦了,因为qt官方下载的windows离线包一直自带的是32位的全套库和32位的mingw编译器,要想获得64位bit,必须自己下载64位的mingw编译器并编译Qt源码,以下是步骤

环境: win10 64bit/Qt5.5.1(为了支持XP这是最晚的版本了,Qt5.6.0开始就对XP支持不太好),mingw4.9.2(Qt5.5.1默认搭配4.9.2)

这步时不要使用在线下载工具,不是报错就是卡在中间,直接下载离线安装包,我是花了4个小时才得出这个结论并找到4.9.2的离线包,太坑了
这是下载地址,如果要使用其他版本,自己改一下url就行

由于在编译时遇到了”File too big”错误,又因为项目急需,我直接采用了-k跳过错误,获得了绝大多数的64位库,如果有谁能完美编译,希望能告诉我方法

if(win32-g++*:if(CONFIG(debug, debug|release))) {
    QMAKE_CXXFLAGS += -Wa,-mbig-obj
}

编译时即可完美编译

一个忠告,不要没事重置系统,重装开发环境会把自己以前踩过的坑一个不漏地全部踩一遍