Использование С++ 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
, если вы заинтересованы в совместимости.