3

LLVM Web ページから Mac (OS X 10.8.4) に clang 3.3 (自作) をダウンロードしましたが、使用時に次のコンパイラ エラーが発生しますstd=c++11 stdlib=libc++

In file included from /usr/include/c++/v1/string:434:
In file included from /usr/include/c++/v1/algorithm:594:
In file included from /usr/include/c++/v1/memory:590:
In file included from /usr/include/c++/v1/typeinfo:61:
/usr/include/c++/v1/exception:146:5: error: an attribute list cannot appear here
    _LIBCPP_NORETURN friend void rethrow_exception(exception_ptr);
    ^~~~~~~~~~~~~~~~
/usr/include/c++/v1/__config:190:28: note: expanded from macro '_LIBCPP_NORETURN'
#  define _LIBCPP_NORETURN [[noreturn]]
                           ^~~~~~~~~~~~

別のlibc ++も必要なようです(MACで100%完成したと言われていましたが...)が、見つかりません。どんな助けでも感謝します。参考までに:

> clang++ -v
clang version 3.3 (tags/RELEASE_33/final)
Target: x86_64-apple-darwin12.4.0
Thread model: posix

そして、はい、私はそれをグーグルで検索し、これを見つけました:http ://comments.gmane.org/gmane.comp.compilers.llvm.bugs/24138 libc++トランクで解決されたと主張しています???


わかりました、Howard が提案したように、トランクの先端の libc++ を /opt/local/share/libcxx にダウンロードしましたが、ビルドに問題があります。マニュアルにはcd libcxx/lib、 、export TRIPLE=-apple-、および run と書かれています./buildit。これは、これが意味することだと思いますbash(私は通常tcshユーザーなので、 を移動し.tcshrc、新しいシェルを取得して を開始しましたbash)。私はそれを行い、コンパイルは機能しましたが、ライブラリのビルドは失敗しました。間違ったものを選択するため(81 行目ではなく、 が設定されていない場合に使用される 103 行目)、明らかに が./buildit表示されません。の先頭にステートメントを追加すると、何も報告されません。どうして?ここで何が問題なのですか?$TRIPLE=-apple-LDSHARED_FLAG$TRIPLEecho $TRIPLE-apple-echo TRIPLE = $TRIPLEbuildit


失敗は、間違ったものLDSHARED_FLAGが選択されたため、ロードが機能しなかったことです ( Linux では意味があると思わldれる不明なオプションについての苦情)。(ファイル)が環境変数を取得しなかった-soname理由がわかりません(やなどの不要なものをいくつか取得しました)。そのファイルの先頭に追加するだけで、ライブラリが構築されました。ただし、ローダーはいくつかの警告を吐き出しましたが、そのすべてが次の形式でしたbuildit#! /bin/shTRIPLECXXCCTRIPLE=-apple-

ld: 警告: ___cxa_bad_typeid で std::bad_typeid のグローバルな弱いシンボル typeinfo に直接アクセスすると、実行時に弱いシンボルをオーバーライドできないことを意味します。これは、異なる可視性設定でコンパイルされた異なる翻訳単位が原因である可能性があります。

しかし、最も重要なことは、それが機能することです (少なくともコンパイルは、まだライブラリをテストしていません)。最後に 1 つ質問があります。アドバイスは、このバージョンの所在を使用-I-Lてコンパイラに伝えることでした。いつもの場所に入れられません/usr/include/c++/v1/か?とにかく、Xcodeにはそのバージョンが別の場所にあることに注意してください/usr/include/c++/v1/。自作のclang 3.2を機能させるために、そのバージョンへのシンボリックリンク( )を入れました(Xcodeの更新後)。図書館はどうですか?標準的な場所にも置けますか?

4

1 に答える 1

4

libc++ のホームページは次のとおりです。

http://libcxx.llvm.org

そこからトランクの先端 libc++ をダウンロードできます。でダウンロードを指すようにclangに指示できます-nostdinc++ -I<path-to-libc++>/include-L<path-to-libc++>/libおよびexport DYLD_LIBRARY_PATH=<path-to-libcxx>/lib. _ 指示はすべて libc++ ホームページにあります。

Xcode は、clang + libc++ を入手する最も簡単な方法です。しかし、最新のものが必要な場合は、ここが最適です。


おめでとう!

ld 警告について心配する必要はありません。これは無害な ld バグであり、将来のリリースで修正される予定です。10.8.4 でも見られますが、何の問題もありません。

libc++ ヘッダーは、/usr/include/c++/v1. Xcode はそれらをそれ自体に移行しました。古いインストールからのlibc++ ヘッダーを持つこと/usr/include/c++/v1は、混乱とバグの原因となっています。私は定期的-nostdinc++ -Iに、必要な libc++ ヘッダーを指すようにしています (複数のバージョンが同時に進行していることがよくあります)。

/usr/lib/libc++.1.dylibあなたが構築したものとあなたが交換することは可能です。これを行うことはお勧めしません。適切なテストを行う必要/usr/libがある場合もありますが、バックアップ ディスクを再起動して元の状態に復元しなければならない場合があるため、常に非常に慎重に行っています。このルートを使用する場合は、元のバックアップを/usr/lib/libc++.1.dylib手元に用意しておくことをお勧めします。

代わり-Lに、コマンド ラインとexport DYLD_LIBRARY_PATH=<path-to-libcxx>/libシェルで使用することをお勧めします。このアドバイスに従わなかったために、自分のコンピューターを本当に厄介な場所に置いた人は 1 人以上 (私を含む) います。

testit(の下で)実行する場合test/、必要なのはDYLD_LIBRARY_PATHそのシェルだけです。testitスクリプトは、インストールなしで適切な場所を指すように設定されています。

また、なぜ変更しなければならなかったのかを考えることをお勧めしますbuildit。他の誰もその行動を見ていません。 printenvあなたのコマンドラインでこの努力に役立つかもしれません。

libc++ は頻繁に更新されます。トランクの先端を常に出荷可能な状態に保つように努めています。

于 2013-08-10T23:33:57.883 に答える