5

如果我将以下内容保存到 /tmp/test.cpp:

#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 正确处理框架的正确方法是什么?

4

2 回答 2

0

请参阅clang_complete: Vim autocompletion for iOS以获得有用的答案。显然clang_complete使用了-cc1不支持该-framework参数的选项。

我能够使用-tripleand -targetoptions 作为-arch我需要的参数的替代品,也许其中一个-cc1args 可以替代-framework?

要重现您的错误,您可以这样做

:! clang -cc1 % -framework CoreServices

所以我认为现在的问题变成了“我如何将框架传递给clang -cc1?”。

编辑:通过运行

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但代码完成仍然无法正常工作.. 嗯

于 2011-10-24T11:10:57.997 回答
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

我猜您可能需要对特定框架中的标头进行一些自省,以准确确定要包含哪些目录。可能有很多。不是很漂亮,但它有效(至少在我的情况下)。

于 2017-05-20T21:48:30.353 回答