使用c++11配合GYP项目
using c++11 with GYP project
我正在尝试用gyp创建一个简单的跨平台c++项目。目前我只是在mac上尝试这个,但希望最终能让它为windows、Linux、ios和android构建。下面是我使用的简单的gyp文件。我想能够使用忍者以及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'
],
},
],
}
我在某种程度上已经弄明白了这一点。至少我让它在mac上运行了一个makefile构建(不是忍者,这是我最初的希望)。
首先,我必须让gyp使用clang而不是g++,要做到这一点,我必须像这样在gyp文件中添加make_global_settings。这似乎不是一个跨平台构建的好计划。我还可以用环境变量设置这些,我猜我可能可以用条件做一些事情,使其特定于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'
],
},
],
}
所以我刚刚在clang++ 6 OSX 10.10上尝试了这个,我遇到了与drewish相同的问题。
将-mmacosx-version-min=10.7
添加到OTHER_CPLUSPLUSFLAGS
和OTHER_LDFLAGS
数组中可以解决此问题。
一个更好的方法,我发现解决这个问题是将"MACOSX_DEPLOYMENT_TARGET": "10.7"
添加到xcode_settings
数组。这将覆盖Node在其公共属性中设置的任何默认值。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)
此错误表明,如果您对MACOSX_DEPLOYMENT_TARGET
的兼容性感兴趣,10.7
是比10.9
更合适的值。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- node-gyp 在 macOS 上未正确链接库
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 如何将CMake项目与基于GYP的库集成
- 节点gyp项目的增量构建
- 使用c++11配合GYP项目