使用c++11配合GYP项目

using c++11 with GYP project

本文关键字:项目 GYP 配合 c++11 使用      更新时间:2023-10-16

我正在尝试用gyp创建一个简单的跨平台c++项目。目前我只是在mac上尝试这个,但希望最终能让它为windows、Linux、ios和android构建。下面是我使用的简单的gyp文件。我想能够使用忍者以及xcode/msvc项目从这个吉普。我知道我需要能够添加
-std=c++11和-libstdc++到clang的命令行,但现在我只看到使用g++而不是clang生成的构建文件。

这是我的gyp文件。

      {
        'targets': [
          {
            'target_name': 'libtest',
            'product_name': 'test',
            'type': 'static_library',
            'sources': [
              './src/lib.cpp',
            ],
            'include_dirs': [
               'include',
            ],
          },
          {
            'target_name': 'testapp',
            'type': 'executable',
            'sources': [
              './test/test.cpp',
            ],
            'include_dirs': [
               'src',
            ],
            'dependencies': [
              'libtest'
            ],
          },
        ],
      }

我在某种程度上已经弄明白了这一点。至少我让它在mac上运行了一个makefile构建(不是忍者,这是我最初的希望)。

首先,我必须让gyp使用clang而不是g++,要做到这一点,我必须像这样在gyp文件中添加make_global_settings。这似乎不是一个跨平台构建的好计划。我还可以用环境变量设置这些,我猜我可能可以用条件做一些事情,使其特定于mac。

'make_global_settings': [
    ['CXX','/usr/bin/clang++'],
    ['LINK','/usr/bin/clang++'],
  ],
  'targets': 
  [
    ......

我必须做的另一件事是根据目标类型添加带有OTHER_CPLUSPLUSFLAGS和OTHER_LDFLAGS的xcode_settings字典。完整示例如下:

{
 'make_global_settings': [
    ['CXX','/usr/bin/clang++'],
    ['LINK','/usr/bin/clang++'],
  ],
  'targets': [
    {
      'target_name': 'mylib',
      'product_name': 'mylib',
      'type': 'static_library',
      'sources': [
        'src/implementation.cc',
      ],
      'include_dirs': [
         'include',
      ],
       'conditions': [
        [ 'OS=="mac"', {
          'xcode_settings': {
            'OTHER_CPLUSPLUSFLAGS' : ['-stdlib=libc++'],
            },
        }],
        ],
    },
    {
      'target_name': 'myapp',
      'type': 'executable',
      'sources': [
        './bin/myapp.cc',
      ],
      'conditions': [
        [ 'OS=="mac"', {
          'xcode_settings': {
            'OTHER_CPLUSPLUSFLAGS' : ['-std=c++11','-stdlib=libc++'],
            'OTHER_LDFLAGS': ['-stdlib=libc++'],
            },
        }],
      ],
      'include_dirs': [
         'include',
      ],
      'dependencies': [
        'mylib'
      ],
    },
  ],
}

所以我刚刚在clang++ 6 OSX 10.10上尝试了这个,我遇到了与drewish相同的问题。

-mmacosx-version-min=10.7添加到OTHER_CPLUSPLUSFLAGSOTHER_LDFLAGS数组中可以解决此问题。

编辑

一个更好的方法,我发现解决这个问题是将"MACOSX_DEPLOYMENT_TARGET": "10.7"添加到xcode_settings数组。这将覆盖Node在其公共属性中设置的任何默认值。gypi文件。

应该是这样的

{
  'targets': [
    {
      'target_name': 'myApp',
      'sources': [ 'myApp.cc' ]
      'conditions': [
        ['OS=="mac"', {
          'xcode_settings': {
            'MACOSX_DEPLOYMENT_TARGET': '10.7'
          }
        }]
      ]
    }
  ]
}

johnhaley81的解决方案确实是最简单的解决方案(至少在OSX上),但是我必须添加一些设置:

  "conditions": [
    [ 'OS=="mac"', {
      "xcode_settings": {
        'MACOSX_DEPLOYMENT_TARGET': '10.9',
        "CLANG_CXX_LIBRARY": "libc++",
        "GCC_ENABLE_CPP_RTTI": "YES",
        "GCC_ENABLE_CPP_EXCEPTIONS": "YES"
      },
    }],
  ],
如你所见,你可以在这里直接使用XCode项目中的名称/值对。很方便。

前面的答案很有帮助,但实际上必须添加到xcode_settings的是'MACOSX_DEPLOYMENT_TARGET': '10.7''CLANG_CXX_LIBRARY': 'libc++'

{
  'targets': [
    {
      'target_name': 'myApp',
      'sources': [ 'myApp.cc' ]
      'conditions': [
        ['OS=="mac"', {
          'xcode_settings': {
            'MACOSX_DEPLOYMENT_TARGET': '10.7',
            'CLANG_CXX_LIBRARY': 'libc++'
          }
        }]
      ]
    }
  ]
}

具体来说,选项'CLANG_CXX_LIBRARY': 'libc++'是我们想要的。如果您添加了选项而没有添加 'MACOSX_DEPLOYMENT_TARGET': '10.7',那么您可能会看到以下错误:

clang: error: invalid deployment target for -stdlib=libc++ (requires OS X 10.7 or later)

此错误表明,如果您对MACOSX_DEPLOYMENT_TARGET的兼容性感兴趣,10.7是比10.9更合适的值。