4

I want to compile a node.js module with the /MD flag (multi-threaded DLL). Having '/MD' in the cflags options in binding.gyp does not work.

4

3 回答 3

4

在玩了 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
                    },
                },
            },
        },
    },],
}
于 2014-11-13T14:20:38.090 回答
3

你需要设置RuntimeLibrary2. 像这样的东西:

'msvs_settings': {
  'VCCLCompilerTool': {
    'RuntimeLibrary': 2, # multi threaded DLL
  },
},
于 2012-11-28T02:07:20.580 回答
0

对于我的项目,唯一的解决方案是创建一个新配置并从原始配置继承:

  '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,但类似的方法应该可以工作。

于 2016-08-08T10:51:03.033 回答