12

我正在尝试使用 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'
            ],
          },
        ],
      }
4

4 回答 4

8

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

首先,我必须让 gyp 使用 clang 而不是 g++ ,为此我必须将 make_global_settings 添加到 gyp 文件中。对于跨平台构建来说,这似乎不是一个好的计划。我还可以使用环境变量设置这些,我猜我可能可以根据条件做一些事情来使其特定于 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'
      ],
    },
  ],
}
于 2013-03-05T06:28:20.060 回答
1

所以我只是在 clang++ 6 OSX 10.10 上尝试了这个,我遇到了同样的问题,这也是一个很糟糕的问题。

添加-mmacosx-version-min=10.7OTHER_CPLUSPLUSFLAGSandOTHER_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'
          }
        }]
      ]
    }
  ]
}
于 2014-10-19T04:29:24.133 回答
0

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

于 2016-09-04T10:02:40.257 回答
0

以前的答案很有帮助,但实际上必须添加的所有内容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)

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

于 2017-09-30T13:15:04.027 回答