【问题标题】:using c++11 with GYP project在 GYP 项目中使用 c++11
【发布时间】:2013-03-02 05:55:08
【问题描述】:

我正在尝试使用 gyp 创建一个简单的跨平台 C++ 项目。目前我只是在 Mac 上尝试这个——但希望最终能够为 Windows、Linux、ios 和 android 构建它。 这是我正在使用的简单 gyp 文件。 我希望能够使用来自这个 gyp 的 ninja 以及 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'
            ],
          },
        ],
      }

【问题讨论】:

    标签: c++ c++11 gyp


    【解决方案1】:

    我在某种程度上已经弄清楚了这一点。至少我让它在 Mac 上工作以进行 makefile 构建(不是我最初希望的 ninja)。

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

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

    我必须做的另一件事是添加一个 xcode_settings 字典,其中包含 OTHER_CPLUSPLUSFLAGS 和 OTHER_LDFLAGS,具体取决于目标类型。完整示例如下。

    {
    
     '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: error: invalid deployment target for -stdlib=libc++ (requires OS X 10.7 or later)吗?
    • 我刚才遇到了。还没有弄清楚。在 OSX 10.10 上。
    【解决方案2】:

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

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

    编辑

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

    所以它应该看起来像这样

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

    【讨论】:

      【解决方案3】:

      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 项目中的名称/值对。很方便。

      【讨论】:

        【解决方案4】:

        前面的答案很有帮助,但实际上必须添加到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_TARGET10.710.9 更合适。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-19
          • 1970-01-01
          • 2013-08-15
          • 2014-07-15
          • 1970-01-01
          • 1970-01-01
          • 2022-10-23
          相关资源
          最近更新 更多