Использование clang_complete с фреймворками OS X - PullRequest
5 голосов
/ 08 октября 2011

Если я сохраню следующее в /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 правильно работать с фреймворками?

Ответы [ 2 ]

0 голосов
/ 21 мая 2017

На тот случай, если у кого-то все еще есть эта проблема (у меня это с расширениями spacemacs до company-clang, но я ожидаю, что проблема та же) ...

Аргумент clang -framework, по-видимому, передается компоновщику, тогда как clang -cc1 касается исключительно компиляции (поэтому он не знает или не поддерживает параметры компоновщика; он, по-видимому, принимает аргумент linker-option=<option>, который работал для меня в моей оболочке, но не был распознан при добавлении в файл .clang_complete). Фреймворк - это просто набор вложенных коллекций заголовков, поэтому вы можете просто включить все необходимые заголовки в фреймворк вручную с помощью -I, и он будет работать.

Пример для Qt5:

Вместо ...

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

использование ...

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

Полагаю, вам, возможно, придется провести некоторый самоанализ заголовков в вашей конкретной среде, чтобы точно определить, какие каталоги включать. Их может быть много. Не очень красиво, но это работает (по крайней мере, в моем случае).

0 голосов
/ 24 октября 2011

См. clang_complete: автозаполнение Vim для iOS для полезного ответа.Очевидно, clang_complete использует параметр -cc1, который не поддерживает аргумент -framework.

Я смог использовать параметры -triple и -target в качестве замены необходимого мне аргумента -arch, может быть, один из аргументов -cc1 может заменить -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, но завершение кода по-прежнему не работает корректно .. Хмм

...