Использование С++ 11 с проектом GYP

Я пытаюсь создать простой кроссплатформенный проект С++ с помощью gyp. В настоящее время я просто пытаюсь это сделать на Mac, но хотел бы получить его для сборки для окон, Linux, ios и андроида в конце концов. HERE - это простой gyp файл, который я использую. Я хотел бы иметь возможность использовать ниндзя, а также проекты xcode/msvc из этого gyp. Я знаю, что мне нужно иметь возможность добавить -std = С++ 11 и -libstdС++ в командной строке для 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'
            ],
          },
        ],
      }

Ответ 1

Я как бы понял это в определенной степени. В lesast я получил его, работая на mac для сборки makefile (а не ниндзя, которая была моей первоначальной надеждой).

Сначала мне пришлось использовать 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'
      ],
    },
  ],
}

Ответ 2

Итак, я просто попробовал это на clang++ 6 OSX 10.10, и я столкнулся с той же проблемой, которая наносила удары.

Добавление -mmacosx-version-min=10.7 в массивы OTHER_CPLUSPLUSFLAGS и OTHER_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)

Эта ошибка указывает, что 10.7 является более подходящим значением, чем 10.9 для MACOSX_DEPLOYMENT_TARGET, если вы заинтересованы в совместимости.