2013-03-02 12 views
12

Sto cercando di creare un semplice progetto C++ multipiattaforma con gyp. Attualmente sto provando questo su un mac - ma vorrei farlo per Windows, Linux, ios e Android alla fine. HEre è il semplice file gyp che sto usando. Mi piacerebbe poter usare i progetti ninja e xcode/msvc da questo gyp. So che devo essere in grado di aggiungere
-std = C++ 11 e -libstdC++ alla riga di comando per clang, ma al momento vedo solo i file di generazione generati usando g ++ invece di clang.utilizzando C++ 11 con il progetto GYP

Questo è il mio file 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' 
      ], 
      }, 
     ], 
     } 

risposta

7

Ho in qualche modo capito questo in una certa misura. A lesast ho lavorato sul mac per creare un makefile (non ninja che era la mia speranza originale).

Per prima cosa dovevo ottenere gyp per usare clang invece di g ++, per fare questo ho dovuto aggiungere un make_global_settings al file gyp in questo modo. Questo non sembra un buon piano per una build multipiattaforma. Sono stato anche in grado di impostarli con variabili di ambiente, immagino che potrò probabilmente fare qualcosa con condizioni per renderlo specifico al mac.

'make_global_settings': [ 
    ['CXX','/usr/bin/clang++'], 
    ['LINK','/usr/bin/clang++'], 
    ], 
    'targets': 
    [ 
    ...... 

L'altra cosa che dovevo fare era aggiungere un xcode_settings dizionario con OTHER_CPLUSPLUSFLAGS e OTHER_LDFLAGS a seconda del tipo di destinazione. Esempio completo di seguito.

{ 

'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

Ti sei imbattuto in 'clang: errore: obiettivo di distribuzione non valido per -stdlib = libC++ (richiede OS X 10.7 o successivo)'? – drewish

+0

Mi sono imbattuto in questo solo ora. Non sono ancora riuscito a capirlo. Su OSX 10.10. – johnhaley81

1

Così ho appena provato questo sul clang ++ 6 OSX 10.10 e ho incontrato lo stesso problema che ha colpito drewish.

L'aggiunta di -mmacosx-version-min=10.7 agli array OTHER_CPLUSPLUSFLAGS e OTHER_LDFLAGS ha risolto il problema.

EDIT

Un modo ancora migliore che ho trovato per risolvere questo problema è quello di aggiungere "MACOSX_DEPLOYMENT_TARGET": "10.7" nella matrice xcode_settings. Ciò sostituirà tutte le impostazioni predefinite che Node imposta nel suo file common.gypi.

Così dovrebbe essere simile a soluzione questo

{ 
    'targets': [ 
    { 
     'target_name': 'myApp', 
     'sources': [ 'myApp.cc' ] 
     'conditions': [ 
     ['OS=="mac"', { 
      'xcode_settings': { 
      'MACOSX_DEPLOYMENT_TARGET': '10.7' 
      } 
     }] 
     ] 
    } 
    ] 
} 
0

di johnhaley81 è davvero il più semplice per ottenere questo lavoro (almeno su OSX), tuttavia ho dovuto aggiungere un paio di impostazioni:

"conditions": [ 
    [ 'OS=="mac"', { 
     "xcode_settings": { 
     'MACOSX_DEPLOYMENT_TARGET': '10.9', 
     "CLANG_CXX_LIBRARY": "libc++", 
     "GCC_ENABLE_CPP_RTTI": "YES", 
     "GCC_ENABLE_CPP_EXCEPTIONS": "YES" 
     }, 
    }], 
    ], 

Come si può vedere, è possibile utilizzare direttamente le coppie nome/valore da un progetto XCode qui. Abbastanza utile.

0

Le risposte precedenti sono stati utili, ma tutto ciò che deve essere effettivamente aggiunto al xcode_settings sono 'MACOSX_DEPLOYMENT_TARGET': '10.7' e '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++' 
      } 
     }] 
     ] 
    } 
    ] 
} 

In particolare, l'opzione 'CLANG_CXX_LIBRARY': 'libc++' è ciò che noi ottenere ciò che vogliamo.Se si aggiunge questa opzione senza'MACOSX_DEPLOYMENT_TARGET': '10.7' allora si potrebbe vedere il seguente errore:

clang: error: invalid deployment target for -stdlib=libc++ (requires OS X 10.7 or later) 

Questo errore indica che 10.7 è un valore più appropriato di 10.9 per MACOSX_DEPLOYMENT_TARGET se siete interessati in grado di compatibilità.