1. 程式人生 > 其它 >用Node-addon-api編譯基於mfc的addon

用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

替換為:附件地址