2011-10-08 32 views
5

Nếu tôi tiết kiệm sau đây để /tmp/test.cpp:Sử dụng clang_complete với OS X khuôn khổ

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

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

tôi có thể biên dịch này một cách chính xác với !clang++ -framework CoreServices %, tuy nhiên clang_complete không thể hoàn thành bất cứ điều gì từ CoreServices.

Tài liệu nói rằng tôi nên đặt tùy chọn trình biên dịch trong tệp .clang_complete (trong trường hợp này tôi đang sử dụng /tmp/.clang_complete), tuy nhiên mọi thứ tôi đã thử cho đến nay sẽ xuất hiện trong cửa sổ sửa lỗi nhanh.

Cách chính xác để nhận được clang_complete để xử lý chính xác khung công tác là gì?

+0

VIM cố gắng tìm kiếm clang_complete từ bạn cwd no? Sau đó, nếu bạn không có trong/tmp/tập tin của bạn không phải là trong/tmp /! – Geoffroy

+0

cwd là/tmp/- Tôi biết tệp .clang_complete đang được đọc vì lỗi 'đối số không xác định' chỉ xuất hiện khi tôi thêm tùy chọn '-framework' vào .clang_complete. – irh

+0

Bạn muốn gọi clang_complete bằng cách sử dụng:! Clang ++? Nhưng điều này chỉ gọi trình biên dịch! Clang_complete của bạn có phải là plugin này không: http://www.vim.org/scripts/script.php?script_id=3302? – Geoffroy

Trả lời

0

Xem clang_complete: Vim autocompletion for iOS để có câu trả lời hữu ích. Rõ ràng clang_complete sử dụng tùy chọn -cc1 không hỗ trợ đối số -framework.

tôi đã có thể sử dụng -triple-target tùy chọn để thay thế cho các đối số -arch tôi cần, có lẽ một trong những -cc1 args có thể thay thế -framework?

Để tái sản xuất lỗi của bạn, bạn có thể làm

:! clang -cc1 % -framework CoreServices 

Vì vậy, tôi nghĩ rằng vấn đề bây giờ trở thành "Làm thế nào tôi có thể vượt qua các khuôn khổ để clang -cc1?".

EDIT: Bằng cách chạy

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

Bạn có thể nhận được đầu ra của clang -cc1

Mine là

-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

tôi loại bỏ các tham số -o, và các tập tin đầu vào, từ kết thúc và thêm nó vào các tùy chọn người dùng trong .vimrc nhưng hoàn thành mã vẫn không hoạt động chính xác .. Hmm

+0

Cảm ơn vì sự đóng góp của bạn :) Nếu không có câu trả lời nào khác, bạn sẽ nhận được tiền thưởng sớm;) – Geoffroy

0

Trong trường hợp bất cứ ai cũng vẫn có vấn đề này (Tôi đang gặp nó với các phần mở rộng spacemacs để company-clang, nhưng tôi hy vọng vấn đề này là như nhau) ...

Đối số clang -framework được rõ ràng truyền cho các mối liên kết , trong khi clang -cc1 chỉ liên quan đến việc biên dịch (vì vậy nó không biết hoặc hỗ trợ các tùy chọn liên kết; nó chấp nhận một đối số linker-option=<option>, rõ ràng, mà làm việc cho tôi trong vỏ của tôi, nhưng không được công nhận khi được thêm vào tệp .clang_complete). Một khung công tác cơ bản chỉ là một loạt các bộ sưu tập tiêu đề lồng nhau, vì vậy bạn chỉ có thể bao gồm tất cả tiêu đề bạn cần trong khung theo cách thủ công với -I và nó sẽ hoạt động.

Ví dụ cho Qt5:

Thay vì ...

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

Sử dụng ...

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

Tôi đoán bạn có thể phải làm một số mâu thuẫn của các tiêu đề trong khuôn khổ cụ thể của bạn để tìm ra chính xác thư mục cần đưa vào. Có thể là rất nhiều người trong số họ. Không phải là rất đẹp, nhưng nó hoạt động (trong trường hợp của tôi, ít nhất).

Các vấn đề liên quan