Я хочу скомпилировать модуль node.js с флагом /MD (многопоточная DLL). Наличие «/MD» в опциях cflags в binding.gyp не работает.
Не удается заставить node-gyp создать решение для Windows с /MD
Ответы (3)
Вам нужно установить RuntimeLibrary
на 2
. Что-то вроде этого:
'msvs_settings': {
'VCCLCompilerTool': {
'RuntimeLibrary': 2, # multi threaded DLL
},
},
После того, как мы поиграли с binding.gyp - много - кажется, что проблема связана не с node-gyp, а с самим gyp и очень специфическим порядком вложенности, который он требует для определенных настроек. То есть для установки библиотеки времени выполнения (в выпуске) параметр библиотеки времени выполнения должен быть вложен в файл gyp как:
configurations
- Release
- msvs_settings
- VCCLCompilerTool
- RuntimeLibrary
Попытка установить библиотеку времени выполнения без какого-либо из этих вложенных элементов останавливает установку библиотеки времени выполнения. (К сожалению, без какого-либо предупреждения, что эта опция игнорируется.)
Поэтому, чтобы установить отладочную и выпускную сборки модуля для использования отладочных библиотек DLL времени выполнения (параметр компилятора /MDd) и выпускных библиотек DLL времени выполнения (параметр компилятора /MD), binding.gyp будет следующим:
{
'targets': [
{
# Usual target name/sources, etc.
'configurations': {
'Debug': {
'msvs_settings': {
'VCCLCompilerTool': {
'RuntimeLibrary': '3' # /MDd
},
},
},
'Release': {
'msvs_settings': {
'VCCLCompilerTool': {
'RuntimeLibrary': '2' # /MD
},
},
},
},
},],
}
Для моего проекта единственным решением было создать новую конфигурацию и наследовать исходную конфигурацию:
'target_defaults': {
'configurations': {
'ChirpDebug' : {
'inherit_from': ['Debug'],
'msvs_settings': {
'VCCLCompilerTool': {
'RuntimeLibrary': '3'
},
},
},
'ChirpRelease' : {
'inherit_from': ['Release'],
'msvs_settings': {
'VCCLCompilerTool': {
'RuntimeLibrary': '2'
},
},
},
},
а затем использовать
msbuild /p:Configuration=ChirpDebug ....
Я попробовал это решение с libuv, и оно работает хорошо. Я не знаю о node-gyp, но подобный подход должен работать.