通过 node-gyp on Windows MS/VS 编译使用调用约定的代码
Compiling code that uses calling conventions via node-gyp on Windows MS/VS
预先声明,我不是 Windows 程序员。
我正在尝试开发一个 Node 扩展,它在 macOS 上运行良好,但在 Windows 上我需要包含一个 header 定义:
typedef DWORD WINAPI (*CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, ::PHKEY, DWORD);
我知道 WINAPI
是 __stdcall
的 #define
,这是 win32 上的调用约定。
该行未使用 MSVS 2017 编译:winportfactory.h(54): error C2059: syntax error: '('
因为 __stdcall
。
我 认为 我为 win32 设置了 MSVS。我打电话给 npm config set arch ia32
,我的 binding.gyp
看起来像这样:
"defines": [
"__WIN32__" # Needed to include the right subheader
],
"msvs_configuration_platform": "win32",
"msvs_settings": {
"VCCLCompilerTool": {
"AdditionalOptions": [
"/EHsc",
"/std:c++17"
]
}
}
这里是完整的编译器调用:
C:\Program Files (x86)\Microsoft Visual Studio17\BuildTools\VC\Tools\MSVC.16.27023\bin\HostX64\x86\CL.exe /c /I"C:\Users\danni\.node-gyp.15.1\include\node" /I"C:\Use
rs\danni\.node-gyp.15.1\src" /I"C:\Users\danni\.node-gyp.15.1\deps\openssl\config" /I"C:\Users\danni\.node-gyp.15.1\deps\openssl\openssl\include" /I"C:\Users\danni\.
node-gyp.15.1\deps\uv\include" /I"C:\Users\danni\.node-gyp.15.1\deps\zlib" /I"C:\Users\danni\.node-gyp.15.1\deps\v8\include" /I..\src /I..\extern\bossa\src /I..\node
_modules\nan /I..\src\compat /Z7 /nologo /W3 /WX- /diagnostics:classic /MP /Ox /Ob2 /Oi /Ot /Oy /GL /D NODE_GYP_MODULE_NAME=bossa /D USING_UV_SHARED=1 /D USING_V8_SHARED=1 /D
V8_DEPRECATION_WARNINGS=1 /D WIN32 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _HAS_EXCEPTIONS=0 /D VERSION=bossajs /D __WIN32__ /D BUILDING_NODE_EXTENSION /
D _WINDLL /GF /Gm- /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR- /Fo"Release\obj\bossa\" /Fd"Release\obj\bossa\vc141.pdb" /Gd /TP /wd4351 /wd4355 /wd4800
/wd4251 /wd4275 /wd4244 /wd4267 /analyze- /FC /errorReport:queue /EHsc /std:c++17 ..\src\index.cc ..\src\bossajs.cc ..\src\observer.cc ..\src\connectworker.cc MORE_FILES "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\src\win_delay_load_hook.cc"
index.cc
我哪里错了?
我发现它失败的原因不是因为它们被关闭或某些配置问题,而是因为 MSVC 不同意令牌的顺序。
需要是:
typedef DWORD (WINAPI *CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, ::PHKEY, DWORD);
This answer 有更多详细信息。
预先声明,我不是 Windows 程序员。
我正在尝试开发一个 Node 扩展,它在 macOS 上运行良好,但在 Windows 上我需要包含一个 header 定义:
typedef DWORD WINAPI (*CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, ::PHKEY, DWORD);
我知道 WINAPI
是 __stdcall
的 #define
,这是 win32 上的调用约定。
该行未使用 MSVS 2017 编译:winportfactory.h(54): error C2059: syntax error: '('
因为 __stdcall
。
我 认为 我为 win32 设置了 MSVS。我打电话给 npm config set arch ia32
,我的 binding.gyp
看起来像这样:
"defines": [
"__WIN32__" # Needed to include the right subheader
],
"msvs_configuration_platform": "win32",
"msvs_settings": {
"VCCLCompilerTool": {
"AdditionalOptions": [
"/EHsc",
"/std:c++17"
]
}
}
这里是完整的编译器调用:
C:\Program Files (x86)\Microsoft Visual Studio17\BuildTools\VC\Tools\MSVC.16.27023\bin\HostX64\x86\CL.exe /c /I"C:\Users\danni\.node-gyp.15.1\include\node" /I"C:\Use
rs\danni\.node-gyp.15.1\src" /I"C:\Users\danni\.node-gyp.15.1\deps\openssl\config" /I"C:\Users\danni\.node-gyp.15.1\deps\openssl\openssl\include" /I"C:\Users\danni\.
node-gyp.15.1\deps\uv\include" /I"C:\Users\danni\.node-gyp.15.1\deps\zlib" /I"C:\Users\danni\.node-gyp.15.1\deps\v8\include" /I..\src /I..\extern\bossa\src /I..\node
_modules\nan /I..\src\compat /Z7 /nologo /W3 /WX- /diagnostics:classic /MP /Ox /Ob2 /Oi /Ot /Oy /GL /D NODE_GYP_MODULE_NAME=bossa /D USING_UV_SHARED=1 /D USING_V8_SHARED=1 /D
V8_DEPRECATION_WARNINGS=1 /D WIN32 /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _HAS_EXCEPTIONS=0 /D VERSION=bossajs /D __WIN32__ /D BUILDING_NODE_EXTENSION /
D _WINDLL /GF /Gm- /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline /GR- /Fo"Release\obj\bossa\" /Fd"Release\obj\bossa\vc141.pdb" /Gd /TP /wd4351 /wd4355 /wd4800
/wd4251 /wd4275 /wd4244 /wd4267 /analyze- /FC /errorReport:queue /EHsc /std:c++17 ..\src\index.cc ..\src\bossajs.cc ..\src\observer.cc ..\src\connectworker.cc MORE_FILES "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\src\win_delay_load_hook.cc"
index.cc
我哪里错了?
我发现它失败的原因不是因为它们被关闭或某些配置问题,而是因为 MSVC 不同意令牌的顺序。
需要是:
typedef DWORD (WINAPI *CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, ::PHKEY, DWORD);
This answer 有更多详细信息。