17

この方法で変数を宣言した後:

   #include <thread>
   namespace thread_space
    {
    thread_local int s;
    } //etc.

「g++ -std=c++0x -pthread [ソースファイル]」を使用してコードをコンパイルしようとしました。次のエラーが表示されます。

example.C:6:8: error: thread-local storage is unsupported for the current target
static thread_local int s;
       ^
1 error generated.

同じフラグを指定して GCC 4.8.1 を使用して Linux で同じコードをコンパイルしようとすると、機能する実行可能ファイルが得られます。OSX 10.9.3 を実行している MacBook Pro で clang-503.0.40 (Xcode 5.1.1 に付属するもの) を使用しています。誰かが私が間違っていることを説明できますか? ありがとうございました!!

4

4 に答える 4

5

試してみてくださいclang++ -stdlib=libc++ -std=c++11。OS X の古い libstdc++ は TLS をサポートしていません。

編集

OK、これは通常のclangバージョンでは機能しますが、Xcodeバージョンでは機能しません.

Apple の clang (503.0.38)通常リリースされているものとの差分を調べたところ、次の違いが見つかりました。

        .Case("cxx_thread_local",
-                 LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported() &&
-                 !PP.getTargetInfo().getTriple().isOSDarwin())
+                 LangOpts.CPlusPlus11 && PP.getTargetInfo().isTLSSupported())

-vしたがって、これはAppleのclangバージョンのバグだと思います(または、意図的にそこに保持していましたが、3.4に基づいているため、それでも奇妙です)。

于 2014-05-25T00:22:56.267 に答える
2

Xcode 8 Beta および GM リリースに含まれる clang コンパイラーは、および(および GCC バリアント) のthread_local両方で C++11 キーワードをサポートします。-std=c++11-std=c++14

WWDC 2016 のビデオ「LLVM の新機能」によると、Xcode の以前のバージョンは、キーワード__threadorを使用して C スタイルのスレッド ローカル ストレージをサポートしていたようです(5:50 から始まる議論を参照してください)。_Thread_local

于 2016-06-14T16:26:57.993 に答える
0

ターゲットとする OS X の最小バージョンを 10.7 以降に設定する必要があるようです。

于 2015-10-09T22:44:58.910 に答える