用Node-addon-api編譯基於mfc的addon
阿新 • • 發佈:2021-10-25
本文介紹如何將微軟框架的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_STANDARD17) 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
替換為:附件地址