2013-03-02 73 views
12

我想創建一個簡單的跨平臺C++項目與gyp。目前我只是試圖在Mac上 - 但最終想讓它爲Windows,Linux,ios和Android構建。 HEre是我正在使用的簡單gyp文件。 我希望能夠使用ninja以及來自此gyp的xcode/msvc項目。 我知道我需要能夠將
-std = C++ 11和-libstdC++添加到clang的命令行中,但現在我只能看到使用g ++而不是clang生成的構建文件。使用C + + 11與GYP項目

這是我的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' 
      ], 
      }, 
     ], 
     } 

回答

7

我在某種程度上已經想通了。至少我在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:error:無效的部署目標--stdlib = libC++(需要OS X 10.7或更高版本)'? – drewish 2014-05-26 18:36:05

+0

剛纔我碰到了。還沒有弄清楚。在OSX 10.10上。 – johnhaley81 2014-10-19 03:56:54

1

所以我只是在鏗鏘聲++ 6 OSX 10.10上試過這個,我遇到了同樣的問題。

OTHER_CPLUSPLUSFLAGSOTHER_LDFLAGS添加-mmacosx-version-min=10.7修復了這個問題。

編輯

一個更好的方法,我發現解決這個問題是添加"MACOSX_DEPLOYMENT_TARGET": "10.7"xcode_settings陣列。這將覆蓋節點在其common.gypi文件中設置的任何默認值。

因此,它應該是這個樣子

{ 
    'targets': [ 
    { 
     'target_name': 'myApp', 
     'sources': [ 'myApp.cc' ] 
     'conditions': [ 
     ['OS=="mac"', { 
      'xcode_settings': { 
      'MACOSX_DEPLOYMENT_TARGET': '10.7' 
      } 
     }] 
     ] 
    } 
    ] 
} 
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項目的名稱/值對。非常方便。

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.710.9MACOSX_DEPLOYMENT_TARGET如果你有興趣在兼容性更適當的值。