用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
替换为:附件地址

改为/MDd
libcmt.lib 改为libcmtd.lib
浙公网安备 33010602011771号