Не удается заставить node-gyp создать решение для Windows с /MD

Я хочу скомпилировать модуль node.js с флагом /MD (многопоточная DLL). Наличие «/MD» в опциях cflags в binding.gyp не работает.


person Remi Arnaud    schedule 20.11.2012    source источник


Ответы (3)


Вам нужно установить RuntimeLibrary на 2. Что-то вроде этого:

'msvs_settings': {
  'VCCLCompilerTool': {
    'RuntimeLibrary': 2, # multi threaded DLL
  },
},
person TooTallNate    schedule 28.11.2012
comment
Спасибо, это правильный вариант. Но мне пришлось изменить файл ~/.node-gyp/0.8.9/common.gypi, который сбрасывает все настройки, которые у меня есть в файле binding.gyp. Мне действительно нужна моя собственная версия node-gyp, чтобы это работало, или я что-то упускаю? - person Remi Arnaud; 30.11.2012
comment
слишком поздно редактировать комментарий... обратите внимание, что правильная настройка - 2 для /MD. 3 есть /MDd - person Remi Arnaud; 30.11.2012
comment
Спасибо, обновил. Начиная с node-gyp v0.8.0, вы можете создать свой собственный common.gypi вместе с файлом binding.gyp и определить там настройку, и она должна иметь приоритет. - person TooTallNate; 01.12.2012
comment
Мне действительно интересно, как заставить это работать... пробую с v0.10.10, и ничего из того, что я установил в common.gypi, похоже, не влияет... Кто-нибудь решил это? - person Irwin Coleman; 20.09.2013
comment
Я потратил немного времени на поиск, и значения RuntimeLibrary выглядят так, как будто они задокументированы здесь: msdn.microsoft.com/en-us/library/aa652367%28v=vs.71%29.aspx - person Mike Tunnicliffe; 11.08.2015

После того, как мы поиграли с 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
                    },
                },
            },
        },
    },],
}
person neurotempest    schedule 13.11.2014

Для моего проекта единственным решением было создать новую конфигурацию и наследовать исходную конфигурацию:

  '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, но подобный подход должен работать.

person Community    schedule 08.08.2016