2012-04-25 13 views
8

He estado tratando de hacer que C++ 11 funcione, después de navegar por diferentes sitios web y Q/A, todavía estoy teniendo problemas. Quiero usar clang con libstdC++. Está indicado en el estado de clang que es compatible con el parche - http://clang.llvm.org/libstdc++4.7-clang11.patch. Descargo el gcc4.7 de macports e hizo cambios en las cabeceras correspondiente para gcc4.7Al habilitar C++ 11 con stdlibC++ 4.7, error de clang, mientras que gcc compila bien

La razón por la que yo no tenga usos libC++ se debe a compatibilidades entre ABI libC++ y libstdC++, indicados por este tema: Why can't clang with libc++ in c++0x mode link this boost::program_options example?

bien, después de todo está hecho, he probado mi configuración con el siguiente código:

#include <mutex> 
#include <thread> 

int main () { 
    std::mutex myMutext; 
    return 0; 
} 

estoy esperando que incluyen debería funcionar en C++ 11.

Así que aquí es cómo puedo compilar con: con GCC

g++ -std=c++11 -I/opt/local/include/gcc47/c++ -L/opt/local/lib/gcc47 main.cpp -o main 

compilar correctamente

con Clang

clang++ -std=c++11 -I/opt/local/include/gcc47/c++ -L/opt/local/lib/gcc47 main.cpp -o main 

estoy recibiendo este error:

@work:boostTest$ clang++ -std=c++11 -I/opt/local/include/gcc47/c++ -L/opt/local/lib/gcc47 main.cpp -o main 
In file included from main.cpp:1: 
In file included from /opt/local/include/gcc47/c++/mutex:38: 
In file included from /opt/local/include/gcc47/c++/tuple:37: 
In file included from /opt/local/include/gcc47/c++/utility:70: 
/opt/local/include/gcc47/c++/bits/stl_relops.h:72:3: error: unknown type name '_GLIBCXX_BEGIN_NAMESPACE_VERSION' 
    _GLIBCXX_BEGIN_NAMESPACE_VERSION 
^
/opt/local/include/gcc47/c++/bits/stl_relops.h:86:5: error: expected unqualified-id 
    template <class _Tp> 
    ^
In file included from main.cpp:1: 
In file included from /opt/local/include/gcc47/c++/mutex:38: 
In file included from /opt/local/include/gcc47/c++/tuple:37: 
In file included from /opt/local/include/gcc47/c++/utility:71: 
In file included from /opt/local/include/gcc47/c++/bits/stl_pair.h:61: 
/opt/local/include/gcc47/c++/bits/move.h:38:1: error: unknown type name '_GLIBCXX_BEGIN_NAMESPACE_VERSION' 
_GLIBCXX_BEGIN_NAMESPACE_VERSION 
^ 
/opt/local/include/gcc47/c++/bits/move.h:45:3: error: expected unqualified-id 
    template<typename _Tp> 
^
In file included from main.cpp:1: 
In file included from /opt/local/include/gcc47/c++/mutex:38: 
In file included from /opt/local/include/gcc47/c++/tuple:37: 
In file included from /opt/local/include/gcc47/c++/utility:71: 
In file included from /opt/local/include/gcc47/c++/bits/stl_pair.h:61: 
In file included from /opt/local/include/gcc47/c++/bits/move.h:57: 
/opt/local/include/gcc47/c++/type_traits:41:1: error: unknown type name '_GLIBCXX_BEGIN_NAMESPACE_VERSION' 
_GLIBCXX_BEGIN_NAMESPACE_VERSION 
^ 
/opt/local/include/gcc47/c++/type_traits:55:3: error: expected unqualified-id 
    template<typename _Tp, _Tp __v> 
^
/opt/local/include/gcc47/c++/type_traits:65:11: error: unknown type name 'integral_constant' 
    typedef integral_constant<bool, true>  true_type; 
     ^
/opt/local/include/gcc47/c++/type_traits:65:28: error: expected unqualified-id 
    typedef integral_constant<bool, true>  true_type; 
         ^
/opt/local/include/gcc47/c++/type_traits:68:11: error: unknown type name 'integral_constant' 
    typedef integral_constant<bool, false> false_type; 
     ^
/opt/local/include/gcc47/c++/type_traits:68:28: error: expected unqualified-id 
    typedef integral_constant<bool, false> false_type; 
         ^
/opt/local/include/gcc47/c++/type_traits:71:36: error: expected ';' after top level declarator 
    constexpr _Tp integral_constant<_Tp, __v>::value; 
           ^
/opt/local/include/gcc47/c++/type_traits:83:14: error: expected class name 
    : public false_type 
      ^
/opt/local/include/gcc47/c++/type_traits:106:14: error: expected class name 
    : public true_type 
      ^
/opt/local/include/gcc47/c++/type_traits:126:14: error: unknown template name 'integral_constant' 
    : public integral_constant<bool, !_Pp::value> 
      ^
/opt/local/include/gcc47/c++/type_traits:126:38: error: expected class name 
    : public integral_constant<bool, !_Pp::value> 
            ^
/opt/local/include/gcc47/c++/type_traits:142:14: error: expected class name 
    : public false_type { }; 
      ^
/opt/local/include/gcc47/c++/type_traits:146:14: error: expected class name 
    : public true_type { }; 
      ^
/opt/local/include/gcc47/c++/type_traits:151:14: error: unknown template name 'integral_constant' 
    : public integral_constant<bool, (__is_void_helper<typename 
      ^
/opt/local/include/gcc47/c++/type_traits:151:38: error: expected class name 
    : public integral_constant<bool, (__is_void_helper<typename 
            ^
fatal error: too many errors emitted, stopping now [-ferror-limit=] 
20 errors generated. 

estoy usando la versión ruido metálico:

Apple clang version 4.0 (tags/Apple/clang-418.2.41) (based on LLVM 3.1svn) 
Target: x86_64-apple-darwin11.3.0 
Thread model: posix 

¿Estoy haciendo algo mal? o es este un problema de clang con la última versión de gcc 4.7 libstC++?

+2

Usted está explícitamente '-I'-ing gcc-4.7 encabezados internos en una compilación' clang'; No esperaría que esto funcione con sensatez. – geekosaur

+0

si hago esto: también veo error. @work: boostTest $ clang ++ -std = C++ 11 -L/opt/local/lib/gcc47 main.cpp -o principal main.cpp: 1: 10: error fatal: archivo 'mutex' no encontrado # include 1 error generado. –

+3

¿Ha intentado pasar -std = C++ 11 -stdlib = libstdC++ –

Respuesta

8

¿Por qué dices -I/opt/local/include/gcc47/c++?

Eso no debería ser necesario ni con GCC ni con Clang, y no funcionará. No todas las cabeceras libstdC++ están bajo ese camino, hay algunas cabeceras esenciales en otros lugares que definen cosas como _GLIBCXX_BEGIN_NAMESPACE_VERSION

No deja con GCC porque GCC ya sabe cómo encontrar las otras cabeceras, por lo que es redundante para utilizar explícitamente -I y -L opciones. No funciona con Clang porque solo le dice cómo encontrar algunos de los encabezados que necesita, pero no le dice cómo encontrar el resto.

Deje de intentar anular las rutas de biblioteca estándar del compilador, permítale usar las rutas integradas que ya conoce.

+0

Tengo el mismo problema. Nuestro problema es que Clang usa el GCC del sistema para sus bibliotecas y encabezados. Queremos utilizar una instalación ** independiente ** de GCC (los de MacPorts) como base de Clang. ¿Cómo le decimos a Clang que busque en otro lugar GCC, que el compilador que está utilizando para las "rutas de biblioteca estándar" es * wrong * ?! (Las respuestas dadas a consultas similares, como "install libC++" o "hard-code the new path and recompile clang", serían inútiles aquí.) – CTMacUser

+2

@CTMacUser, necesita reconstruir clang, usando '--with-gcc- toolchain' para decirle dónde encontrar los encabezados y libs de GCC. Es posible que usted pueda anular las rutas para su instalación existente con un uso muy cuidadoso de muchas de las opciones '-I' y' -L', pero debe anular ** todas ** las rutas relevantes. Compila con 'gcc -v' para ver todos los directorios de búsqueda estándar que utiliza GCC, que también necesitarás decirle a Clang que use. Incluso entonces podría no funcionar (clang tiene algunas rutas codificadas que se configuran cuando lo instalas y no sé si pueden ser anuladas) –

+0

Creo que esta es la respuesta correcta. –

7

Estoy usando clang-3.1 con gcc4.6 libstdC++ en FreeBSD 9.0/AMD64. Funciona con estas opciones:

-I/usr/local/lib/gcc46/include/c++ \ 
-I/usr/local/lib/gcc46/include/c++/x86_64-portbld-freebsd9.0 \ 
-L/usr/local/lib/gcc46 

supongo que su problema puede ser resuelto a utilizar estas opciones:

-I/opt/local/include/gcc47/c++ \ 
-I/opt/local/include/gcc47/c++/x86_64-apple-darwin11.3.0 \ 
-L/opt/local/lib/gcc47 
0

Puede utilizar el special option -gcc-toolchain, que se establece implícitamente por --with-gcc-toolchain al compilar sonido metálico.Es un poco más fácil que tañido recompilación cuando se quiere utilizar otro bibliotecas CCG :)

Al igual que:

~/clang/trunk/bin/clang++ main.cc -gcc-toolchain ~/gcc/trunk -o main 

O, en su caso (Sé que es 4 años :)) parece ser

clang++ main.cpp -o main -gcc-toolchain /opt/local 

La carpeta 'toolchain' debe contener las carpetas 'incluir' y 'lib'. Tanto el compilador como el enlazador usan esta opción. Tenga cuidado: --gcc-toolchain no es una opción válida, use un guion como prefijo (aunque el llvm wiki indique lo contrario - Lo comprobé en el tronco de claqueta 3.8).

Cuestiones relacionadas