2011-10-20 3 views
5

Recentemente ho cercato di configurare un flusso di lavoro iOS basato su Vim.clang_complete: Vim completamento automatico per iOS

ho trovato clang_complete, e hanno fissato le opzioni utente clang nel mio Vimrc in questo modo

let g:clang_user_options='-fblocks -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -D__IPHONE_OS_VERSION_MIN_REQUIRED=40300' 

come descritto qui: http://www.zenskg.net/wordpress/?p=199#comment-229

e aggiunto qualche quadro/intestazione/percorsi lib. Non pubblicherò l'intera riga perché è enorme.

Così ho provato la compilazione di uno dei file nel mio progetto utilizzando clang dalla riga di comando (utilizzando le stesse opzioni), e si compila bene, ma solo se uso la bandiera -arch armv6/7. Se non lo faccio tenta di compilare per i386 e si lamenta di file di intestazione mancanti.

Fin qui tutto bene. Ora uso solo le stesse identiche opzioni che ho dato a clang, alle opzioni utente di clang_complete nel mio .vimrc giusto?

No. Quando faccio questo e cerco di completamento automatico una parola in Vim, si dice

unknown argument: '-arch' 

nella lista QuickFix di Vim. Ho bisogno di questa bandiera, come devo procedere?

Qualsiasi idea utile. Mi piacerebbe ottenere il completamento del codice iOS lavorando sotto Vim.

risposta

3

clang_complete esegue clang -cc1, che causa l'esecuzione del front-end del compilatore e non il driver. Il front-end del compilatore non comprende l'opzione -arch. clang -cc1 --help ti mostrerà le possibili opzioni. Probabilmente dovresti specificare -triple o uno di -target-*.

Se non si è sicuri di cosa utilizzare, è possibile eseguire clang manualmente come avete fatto, ma in modalità dettagliata (-v). In questo modo stamperà la riga di comando clang -cc1, dove è possibile trovare gli argomenti appropriati.

+0

Grazie mille ... Questo mi ha dato molto di più. Ho eseguito xcodebuild con in modalità dettagliata, copiato le opzioni clang, poi ho eseguito clang con queste opzioni in modalità dettagliata, quindi ho copiato le opzioni clang -cc1 dall'output nel mio .vimrc. clang_complete non può ancora completare automaticamente il mio codice, penso di aver bisogno di usare il flag -frameworks che non sembra avere un equivalente in -cc1. Potresti indicarmi qualche documentazione? Le pagine man non sono molto buone - non avrei mai saputo dell'opzione -cc1 senza che tu me lo dica. – Sam

+1

Ecco qualcosa che potresti provare: apri ~/.vim/plugin/clang_complete.vim (o ovunque tu abbia installato clang_complete), e cerca la funzione ClangCompleteBinary. Ci sono due cose da provare: 1. Commentare v: shell_error condition block. Clang restituirà spesso buone opzioni di completamento anche quando ha un errore di compilazione e clang_complete ignora questo fatto. 2. cambia sistema (l: comando) in system (l: comando. '| & Tee /tmp/clang.log') e avvia un completamento da vim. Quindi sarai in grado di vedere in /tmp/clang.log l'esatto errore generato da clang. Spero che questo aiuti. –

3

Per impostazione predefinita, clang_complete utilizza il clang binario /usr/bin/clang, ma Xcode no. Sta usando la libreria clang /Developer/usr/clang-ide/lib/libclang.dylib. Non sono esattamente la stessa cosa. Se stai copiando le opzioni che XCode sta usando, dovrai assicurarti che clang_complete usi anche la versione della libreria.

Qualcosa di simile nel file .vimrc dovrebbe farlo:

filetype on 
autocmd FileType objc let g:clang_use_library=1 
autocmd FileType objc let g:clang_library_path='/Developer/usr/clang-ide/lib' 

Quando lo faccio, -arch i386 è accettato.

(PS - ho avuto un paio di altri problemi per ottenere clang_complete a lavorare per lo sviluppo iOS È forza desidera controllare questo bivio: https://github.com/krisajenkins/clang_complete Sono troppo nuova per clang di sapere davvero quello che sto facendo.. , ma sta funzionando per me ...)

0

Utilizzando il sdk 5.1 non ero in grado di ottenere -arch accettato anche quando si utilizza libclang.dylib.

Dopo qualche futzing (vale a dire, in esecuzione manualmente i comandi clang prodotte dalla xcodebuild con la bandiera -v come suggerito), il mio migliore messa a punto era:

let g:clang_complete_auto = 1 

"not strictly necessary 
set omnifunc=ClangComplete 

let g:clang_user_options='clang -cc1 -triple i386-apple-macosx10.6.7 -target-cpu yonah -target-linker-version 128.2 -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/3.1 -fblocks -x objective-c -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk -D __IPHONE_OS_VERSION_MIN_REQUIRED=50100 || exit 0' 

aggiungendo -cc1 è l'unica cosa che non vedo già detto in altre risorse su Stackoverflow o altrove (a quanto pare questo flag consente la combinazione bastardizzata di driver clang e flag raw cc1). Una volta aggiunto, improvvisamente ha funzionato almeno per il completamento di Cocoa e UIKit (prova a digitare [NSString C-x C-u).

Tuttavia, qualcosa è ancora leggermente sballato.

Digitando :copen vedo questo dopo un completamento (con successo o meno):

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CFURL.h|654 col 48 error| expected ';' after top level declarator 

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CFUtilities.h|14 col 39 error| expected function body after function declarator 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CFBase.h|60 col 32 info| expanded from macro 'CF_AVAILABLE_IOS' 
/usr/include/Availability.h|145 col 53 info| expanded from macro '__OSX_AVAILABLE_STARTING' 
<scratch space>|25 col 1 info| expanded from macro '__AVAILABILITY_INTERNAL' 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/System/Library/Frameworks/CoreFoundation.framework/Headers/CoreFoundation.h|92 col 10 error| 'CoreFoundation/CFUserNotification.h' file not found 

Inoltre, anche se ho aggiunto vari -I bandiere a uno mio .clang_complete file o direttamente al clang_user_option s stringa, clang_complete funziona solo con alcune ma non tutte le intestazioni nel mio progetto ... senza una ragione apparente per cui si lavori ma non altri. (Suggerimenti benvenuto).