我感觉谷歌的官方文档本身就不完善,导致我没办法详解,很多配置都是看 别人写的 慢慢摸索出来的。windows篇章里,我实现了一个海康node插件,linux版里,我同样实现了这个功能.
{
"variables": {"module_path%": ""},
"targets": [
{
"target_name": "hik_camera",
"cflags!": ["-fno-exceptions"],
"cflags_cc!": ["-fno-exceptions"],
"sources": [
"src/index.cpp",
"src/KSHikCameraWrapper.cpp",
"src/common.cpp",
],
"include_dirs": ["<!@(node -p \"require('node-addon-api').include\")"],
"defines": ["NAPI_DISABLE_CPP_EXCEPTIONS", "NAPI_VERSION=6"],
"conditions": [
[
'OS == "win"',
{
"msvs_configuration_attributes": {"CharacterSet": "0"},
"msvs_settings": {
"VCCLCompilerTool": {"DebugInformationFormat": 3}
},
"include_dirs": ["sdk/win/include"],
"libraries": ["../sdk/win/lib/HCNetSDK.lib"],
"conditions": [
[
'module_path == ""',
{
"copies": [
{
"destination": "<(module_root_dir)/prebuilds/win32-x64",
"files": [
"<(module_root_dir)/sdk/win/bin/AudioRender.dll",
"<(module_root_dir)/sdk/win/bin/GdiPlus.dll",
"<(module_root_dir)/sdk/win/bin/HCCore.dll",
"<(module_root_dir)/sdk/win/bin/HCNetSDK.dll",
"<(module_root_dir)/sdk/win/bin/hlog.dll",
"<(module_root_dir)/sdk/win/bin/HmMerge.dll",
"<(module_root_dir)/sdk/win/bin/hpr.dll",
"<(module_root_dir)/sdk/win/bin/HXVA.dll",
"<(module_root_dir)/sdk/win/bin/libeay32.dll",
"<(module_root_dir)/sdk/win/bin/libmmd.dll",
"<(module_root_dir)/sdk/win/bin/MP_Render.dll",
"<(module_root_dir)/sdk/win/bin/NPQos.dll",
"<(module_root_dir)/sdk/win/bin/PlayCtrl.dll",
"<(module_root_dir)/sdk/win/bin/ssleay32.dll",
"<(module_root_dir)/sdk/win/bin/SuperRender.dll",
"<(module_root_dir)/sdk/win/bin/YUVProcess.dll",
"<(module_root_dir)/sdk/win/bin/zlib1.dll",
"<(module_root_dir)/sdk/win/bin/HCNetSDKCom/",
],
}
]
},
'module_path != ""',
{
"copies": [
{
"destination": "<(module_root_dir)/<(module_path)",
"files": [
"<(module_root_dir)/sdk/win/bin/AudioRender.dll",
"<(module_root_dir)/sdk/win/bin/GdiPlus.dll",
"<(module_root_dir)/sdk/win/bin/HCCore.dll",
"<(module_root_dir)/sdk/win/bin/HCNetSDK.dll",
"<(module_root_dir)/sdk/win/bin/hlog.dll",
"<(module_root_dir)/sdk/win/bin/HmMerge.dll",
"<(module_root_dir)/sdk/win/bin/hpr.dll",
"<(module_root_dir)/sdk/win/bin/HXVA.dll",
"<(module_root_dir)/sdk/win/bin/libeay32.dll",
"<(module_root_dir)/sdk/win/bin/libmmd.dll",
"<(module_root_dir)/sdk/win/bin/MP_Render.dll",
"<(module_root_dir)/sdk/win/bin/NPQos.dll",
"<(module_root_dir)/sdk/win/bin/PlayCtrl.dll",
"<(module_root_dir)/sdk/win/bin/ssleay32.dll",
"<(module_root_dir)/sdk/win/bin/SuperRender.dll",
"<(module_root_dir)/sdk/win/bin/YUVProcess.dll",
"<(module_root_dir)/sdk/win/bin/zlib1.dll",
"<(module_root_dir)/sdk/win/bin/HCNetSDKCom/",
],
}
]
},
]
],
},
'OS == "linux"',
{
"include_dirs": ["sdk/linux/include"],
"libraries": [
"-L<(module_root_dir)/sdk/linux/bin",
"-lhcnetsdk",
],
"link_settings": {
"libraries": ["-Wl,-rpath,'$$ORIGIN'"],
},
# "cflags": ["-finput-charset='gbk'"],
"cflags": ["-finput-charset='gbk'", "-fexec-charset='gbk'"],
# "cflags_cc": ["-fwide-exec-charset='gbk'"],
"conditions": [
[
'module_path == ""',
{
"copies": [
{
"destination": "<(module_root_dir)/prebuilds/linux-x64",
"files": [
"<(module_root_dir)/sdk/linux/bin/HCNetSDK_Log_Switch.xml",
"<(module_root_dir)/sdk/linux/bin/libAudioRender.so",
"<(module_root_dir)/sdk/linux/bin/libcrypto.so",
"<(module_root_dir)/sdk/linux/bin/libcrypto.so.1.0.0",
"<(module_root_dir)/sdk/linux/bin/libHCCore.so",
"<(module_root_dir)/sdk/linux/bin/libhcnetsdk.so",
"<(module_root_dir)/sdk/linux/bin/libhpr.so",
"<(module_root_dir)/sdk/linux/bin/libNPQos.so",
"<(module_root_dir)/sdk/linux/bin/libopenal.so.1",
"<(module_root_dir)/sdk/linux/bin/libPlayCtrl.so",
"<(module_root_dir)/sdk/linux/bin/libssl.so",
"<(module_root_dir)/sdk/linux/bin/libSuperRender.so",
"<(module_root_dir)/sdk/linux/bin/libz.so",
"<(module_root_dir)/sdk/linux/bin/HCNetSDKCom/",
],
}
]
},
'module_path != ""',
{
"copies": [
{
"destination": "<(PRODUCT_DIR)",
"files": [
"<(module_root_dir)/sdk/linux/bin/HCNetSDK_Log_Switch.xml",
"<(module_root_dir)/sdk/linux/bin/libAudioRender.so",
"<(module_root_dir)/sdk/linux/bin/libcrypto.so",
"<(module_root_dir)/sdk/linux/bin/libcrypto.so.1.0.0",
"<(module_root_dir)/sdk/linux/bin/libHCCore.so",
"<(module_root_dir)/sdk/linux/bin/libhcnetsdk.so",
"<(module_root_dir)/sdk/linux/bin/libhpr.so",
"<(module_root_dir)/sdk/linux/bin/libNPQos.so",
"<(module_root_dir)/sdk/linux/bin/libopenal.so.1",
"<(module_root_dir)/sdk/linux/bin/libPlayCtrl.so",
"<(module_root_dir)/sdk/linux/bin/libssl.so",
"<(module_root_dir)/sdk/linux/bin/libSuperRender.so",
"<(module_root_dir)/sdk/linux/bin/libz.so",
"<(module_root_dir)/sdk/linux/bin/HCNetSDKCom/",
],
}
]
},
]
],
},
]
],
}
],
}
部分指令的解释:
一,条件
可以根据 conditions 实现条件编译,比如在 windows 平台下,或者 Linux 平台下引用不同的库。
二,编译器链接器指令
windows 下,我使用的微软的cl(c/c++) 编译器,所以可以传入编译和链接指令。上图所示就是如何配置字符集。
那么gyp支持哪些配置呢?在查看了gyp的源码之后,我发现,只支持这么几种:
那么这些指令对应的文档在哪里呢?大家可以看这里:配置选项
细节方面,大家自己看MSDN吧,然后自己尝试配置看看。
再就是linux一些配置:
关于linux的一些配置,如果涉及到引用第三方库,则需要处理好库文件路径。对于这个问题,大家可以移步看看我的这篇文章。
以上,就是gyp配置文件的一些粗解,其实其最终目的,就是配置一些参数,传给编译器链接器使用的。