用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

替换为:附件地址

posted @   Asp1rant  阅读(315)  评论(0编辑  收藏  举报
编辑推荐:
· 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工具
点击右上角即可分享
微信分享提示