Я пытаюсь создать простой кроссплатформенный проект C ++ с помощью GIP. В настоящее время я просто пробую это на Mac — но хотел бы получить его для Windows, Linux, IOS и Android в конце концов.
Вот простой файл GYP, который я использую.
Я хотел бы иметь возможность использовать ниндзя, а также проекты xcode / msvc из этого гипа.
Я знаю, что мне нужно иметь возможность добавлять
-std = c ++ 11 и -libstdc ++ для командной строки для clang, но сейчас я вижу только сгенерированные файлы сборки, используя g ++ вместо clang.
Это мой файл.
{
'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 для сборки make-файла (не ниндзя, который был моей первоначальной надеждой).
Сначала я должен был заставить 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 ++ 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'
}
}]
]
}
]
}
Решение 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)
Эта ошибка указывает на то, что 10.7
является более подходящим значением, чем 10.9
за MACOSX_DEPLOYMENT_TARGET
если вы заинтересованы в совместимости.