用Node-addon-api编译基于mfc的addon
本文介绍如何将微软框架的C++代码(Win32)编译成node-addon,使之可以通过Nodejs调用。
环境:
- Nodejs版本:12.22 (32bit)
- VS2019
1. 编译文件的编写
无论是binding.gyp,还是写CMake-js,都需要包含msvc相关依赖
1.1. binding.gyp
{
"targets": [
{
"target_name": "Addon",
"cflags!": [ "-std=c++11", "-fno-exceptions", "-fno-rtti"],
"cflags_cc!": [ "-std=c++11", "-fno-exceptions", "-fno-rtti"],
"sources": [
...... # your src file
"framework.h"
],
'msvs_settings': {
'VCCLCompilerTool': {
'RuntimeTypeInfo': 'true',
},
},
"include_dirs": [
"<!@(node -p \"require('node-addon-api').include\")",
... # your dependency
],
'defines': [
'NAPI_DISABLE_CPP_EXCEPTIONS',
'UNICODE',
'WIN32'
],
'link_settings': {
'libraries': [
'uafxcw.lib', '-llibcmt.lib'
],
}
}
]
}
1.2. CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(Addon LANGUAGES CXX)
include_directories(${CMAKE_JS_INC})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_BUILD_TYPE debug)
set(CMAKE_MFC_FLAG 2)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
include_directories(node_modules/node-addon-api)
include_directories(...)
add_library(Addon SHARED
...
${CMAKE_JS_SRC}
)
add_definitions(-DNAPI_DISABLE_CPP_EXCEPTIONS -DUNICODE -DWIN32 -D_AFXDLL)
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node")
target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB} -lsioclient -lpthread -ljsoncpp -llibcmt)
add_compile_options(-fPIC)
编译完了以后会在项目目录的文件夹生成一个build文件夹,里面包含了sln文件可以用于visual studio项目。
2. 遇到的问题
2.1. 无法编译Debug版本
修改编译选项:
- MFC选项改为使用MFC静态库
改为/MDd
-
libcmt.lib 改为libcmtd.lib
2.2. 缺少一些MFC依赖
右键项目,Add -> New Item... ,选择ATL Support,会生成一个framework.h头文件,include进来
2.3. 运行时,pATLModule空指针
将下面两段话加到代码里
CComModule _Module;
extern __declspec(selectany) CAtlModule* _pAtlModule = &_Module;
2.4. dynamic_cast一运行就报错
替换下目录的文件:C:\Users\<UserName>\AppData\Local\node-gyp\Cache\<Node Version>\include\node\common.gypi
替换为:附件地址
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具