2011-10-08 13 views
5

Si salvo lo siguiente para /tmp/test.cpp:clang_complete con OS X marcos

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

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

puedo compilar este correctamente con !clang++ -framework CoreServices %, sin embargo clang_complete no puede completar nada de CoreServices.

Los documentos dicen que debo colocar las opciones del compilador en un archivo .clang_complete (en este caso estoy usando /tmp/.clang_complete), sin embargo, todo lo que he intentado hasta ahora da como resultado test.cpp|| unknown argument: '-framework' que aparece en la ventana de solución rápida.

¿Cuál es la forma correcta de obtener clang_complete para tratar con marcos correctamente?

+0

VIM intente buscar clang_complete de usted cwd no? ¡Entonces si no está en/tmp/su archivo no debe estar en/tmp /! – Geoffroy

+0

cwd is/tmp/- Sé que el archivo .clang_complete se está leyendo debido a que el error de "argumento desconocido" solo aparece cuando agrego la opción '-framework' a .clang_complete. – irh

+0

¿Quieres llamar a clang_complete usando:! Clang ++? ¡Pero esto solo llama al compilador! ¿Tu clang_completo este complemento: http://www.vim.org/scripts/script.php?script_id=3302? – Geoffroy

Respuesta

0

Ver clang_complete: Vim autocompletion for iOS para una respuesta útil. Aparentemente clang_complete usa la opción -cc1 que no admite el argumento -framework.

pude usar -triple y -target opciones como reemplazos para el argumento -arch que necesitaba, tal vez uno de los argumentos -cc1 puede sustituir -framework?

para reproducir el error, puede hacer

:! clang -cc1 % -framework CoreServices 

Así que creo que la pregunta ahora es "¿Cómo puedo pasar a marcos clang -cc1?".

EDIT: Mediante la ejecución de

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

Puede obtener la salida de clang -cc1

mina fue

-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

Quité el argumento -o, y el archivo de entrada, desde al final y lo agregó a las opciones de usuario en .vimrc pero la finalización del código aún no funciona correctamente. Hmm

+0

Gracias por su contribución :) Si no hay otras respuestas, recibirá la recompensa pronto;) – Geoffroy

0

Por si alguien todavía tiene también este problema (que estoy teniendo con las extensiones spacemacs a company-clang, pero espero que el problema es el mismo) ...

El argumento clang -framework es aparentemente pasa al enlazador , mientras que clang -cc1 se refiere exclusivamente a la compilación (por lo que no conoce ni admite las opciones del enlazador; acepta un argumento linker-option=<option>, al parecer, que funcionó para mí en mi shell, pero no fue reconocido cuando se agregó al archivo .clang_complete). Sin embargo, un framework es básicamente un conjunto de colecciones de encabezados anidados, por lo que puede incluir manualmente todos los encabezados que necesita en el marco con -I y funcionará.

Ejemplo para QT5:

En lugar de ...

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

uso ...

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

supongo que puede tener que hacer un poco de introspección de las cabeceras en su marco determinado para averiguar exactamente qué directorios para incluir. Podrían ser muchos de ellos. No es muy bonito, pero funciona (en mi caso, al menos).