9

さまざまなWebサイトやQ/Aを閲覧した後、C ++ 11を機能させようとしていますが、まだ問題があります。libstdc++でclangを使いたい。パッチでサポートされていることがclangステータスで示されます-http ://clang.llvm.org/libstdc++4.7-clang11.patch。Macportsからgcc4.7をダウンロードし、gcc4.7のヘッダーに対応する変更を加えました

私がlibc++を使用しない理由は、このスレッドで示されているように、libc++とlibstdc++の間のABI互換性があるためです。

OK、すべてが完了した後、次のコードを使用してセットアップをテストしました。

#include <mutex>
#include <thread>

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

includeはc++11で動作するはずです。

だからここに私がそれをコンパイルする方法があります:GCCで

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

正常にコンパイル

Clangで

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

このエラーが発生します:

@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.

私はclangバージョンを使用しています:

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

私は何か間違ったことをしていますか?または、これは最新のgcc 4.7 libstc ++でのclangの問題ですか?

4

3 に答える 3

8

なんで言ってるの-I/opt/local/include/gcc47/c++

これはGCCでもClangでも必要ないはずであり、機能しません。すべてのlibstdc++ヘッダーがそのパスの下にあるわけではありません。他の場所に、次のようなものを定義するいくつかの重要なヘッダーがあります。_GLIBCXX_BEGIN_NAMESPACE_VERSION

GCCは他のヘッダーを見つける方法をすでに知っているため、GCCで失敗することはありません。したがって-I-Lオプションを明示的に使用することは冗長です。必要なヘッダーの一部を見つける方法を指示しているだけで、残りのヘッダーを見つける方法を指示していないため、Clangでは機能しません。

コンパイラの標準ライブラリパスを上書きしようとするのをやめ、すでに知っている組み込みパスを使用させます。

于 2012-05-06T13:32:52.160 に答える
7

FreeBSD 9.0/AMD64でgcc4.6libstdc++とともにclang-3.1を使用しています。次のオプションで動作します。

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

私はあなたの問題がこれらのオプションを使用することで解決されるかもしれないと思います:

-I/opt/local/include/gcc47/c++ \
-I/opt/local/include/gcc47/c++/x86_64-apple-darwin11.3.0 \
-L/opt/local/lib/gcc47
于 2012-05-23T06:28:55.510 に答える
1

特別なオプション-gcc-toolchainを使用できます。これは、 --with-gcc-toolchainclangをコンパイルするときに暗黙的に設定されます。別のGCCライブラリを使用する場合は、clangを再コンパイルするよりも少し簡単です:)

そのように:

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

または、あなたの場合(私はそれが4歳であることを知っています:))それは

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

'toolchain'フォルダーには、'include'フォルダーと'lib'フォルダーが含まれている必要があります。コンパイラとリンカの両方がこのオプションを使用します。注意:--gcc-toolchainこれは有効なオプションではありません。プレフィックスとしてダッシュを1つ使用してください(llvm wikiには別の方法が記載されていますが、clang 3.8トランクでチェックしました)。

于 2016-01-14T15:03:01.227 に答える