2011-10-08 90 views
5

如果我救下到/tmp/test.cpp:與OS X上使用clang_complete構架

#include <CoreServices/CoreServices.h> 
#include <iostream> 

int main() { 
    CFStringRef my_string = CFSTR("hello, world!"); 
    std::cout << CFStringGetLength(my_string) << '\n'; 
} 

我可以!clang++ -framework CoreServices %正確編譯這一點,但是clang_complete不能從CoreServices完成任何事情。

文檔說我應該將編譯器選項放在.clang_complete文件中(在這種情況下,我使用的是/tmp/.clang_complete),但是我迄今試過的所有內容都導致test.cpp|| unknown argument: '-framework'出現在快速修復窗口中。

讓clang_complete正確處理框架的正確方法是什麼?

+0

VIM嘗試從您的cwd中搜索clang_complete否?那麼如果你不在/ tmp /你的文件不能在/ tmp /中! – Geoffroy

+0

cwd is/tmp/- 我知道正在讀取.clang_complete文件,因爲只有在將'-framework'選項添加到.clang_complete時出現'unknown argument'錯誤。 – irh

+0

你的意思是使用clang_complete來調用:!clang ++?但是這隻能調用編譯器!是你的clang_complete這個插件:http://www.vim.org/scripts/script.php?script_id=3302? – Geoffroy

回答

0

請參閱clang_complete: Vim autocompletion for iOS以獲得有用的答案。顯然clang_complete使用-cc1選項,它不支持-framework參數。

我能夠使用-triple-target選項替換爲-arch說法我需要,-cc1參數的個數,也許可以取代-framework

要重現你的錯誤,你可以做

:! clang -cc1 % -framework CoreServices 

所以我認爲,現在的問題變成了「如何傳遞框架,以0​​?」。

編輯:通過運行

clang++ -v -framework CoreServices ./test.cpp 

你可以得到clang -cc1

礦的產量

-triple x86_64-apple-macosx10.6.7 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name test.cpp -pic-level 1 -mdisable-fp-elim -relaxed-aliasing -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 123.2 -v -resource-dir /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/../lib/clang/2.1 -fdeprecated-macro -ferror-limit 19 -fmessage-length 179 -stack-protector 1 -fblocks -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/w2/w26NavGvGauuJwhTtEeQ9++++TI/-Tmp-/cc-GbJXd6.o -x c++ ./test.cpp

我刪除了-o參數,輸入文件,從結束並將其添加到.vimrc中的用戶選項,但代碼完成仍然無法正常工作。嗯

+0

感謝您的貢獻:)如果沒有其他答案,您很快就會得到賞金;) – Geoffroy

0

在任何情況下也仍然有這個問題(我用spacemacs擴展爲它company-clang,但我相信這個問題是一樣的)...

clang -framework說法顯然是傳遞給鏈接,而clang -cc1專注於編譯(所以它不知道或支持鏈接器選項;它確實接受linker-option=<option>參數,顯然,它在我的shell中適用於我,但在添加到.clang_complete文件時無法識別)。但是,框架基本上只是一堆嵌套的標題集合,因此您可以使用-I手動將所需的所有標題包含在框架中,並且它可以工作。

爲QT5

例子:

而不是...

-F/usr/local/opt/qt5/lib 
-framework QtCore 

使用...

-I/usr/local/opt/qt5/lib/QtCore.framework/Versions/Current/Headers 

我猜你可能需要做頭的自省在特定的框架準確找出其中包含的目錄。可能很多。不是很漂亮,但它起作用(至少在我的情況下)。