Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode c++;线程本地存储clang-503.0.40(Mac OSX)_Xcode_Macos_C++11_Clang_Thread Local Storage - Fatal编程技术网

Xcode c++;线程本地存储clang-503.0.40(Mac OSX)

Xcode c++;线程本地存储clang-503.0.40(Mac OSX),xcode,macos,c++11,clang,thread-local-storage,Xcode,Macos,C++11,Clang,Thread Local Storage,在我以这种方式声明变量之后: #include <thread> namespace thread_space { thread_local int s; } //etc. 如果我尝试在Linux上用GCC4.8.1编译相同的代码,并使用相同的标志,我会得到一个运行正常的可执行文件。我正在运行OSX 10.9.3的MacBookPro上使用clang-503.0.40(Xcode 5.1.1附带的版本)。谁能解释一下我做错了什么? 谢谢 试试cl

在我以这种方式声明变量之后:

   #include <thread>
   namespace thread_space
    {
    thread_local int s;
    } //etc.
如果我尝试在Linux上用GCC4.8.1编译相同的代码,并使用相同的标志,我会得到一个运行正常的可执行文件。我正在运行OSX 10.9.3的MacBookPro上使用clang-503.0.40(Xcode 5.1.1附带的版本)。谁能解释一下我做错了什么?
谢谢

试试
clang++-stdlib=libc++-std=c++11
。OS X过时的libstdc++不支持TLS

编辑

好的,这适用于普通的clang版本,但不适用于Xcode版本

我对和进行了比较,发现了以下差异:

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

所以我认为这是Apple的clang版本中的一个bug(或者他们故意把它放在那里——但仍然很奇怪,因为
-v
说基于3.4)。

或者,你可以使用编译器扩展,比如(GCC/clang)或(Visual Studio)

将其包装在宏中,您可以轻松地跨不同的编译器和语言版本移植代码:

#if HAS_CXX11_THREAD_LOCAL
    #define ATTRIBUTE_TLS thread_local
#elif defined (__GNUC__)
    #define ATTRIBUTE_TLS __thread
#elif defined (_MSC_VER)
    #define ATTRIBUTE_TLS __declspec(thread)
#else // !C++11 && !__GNUC__ && !_MSC_VER
    #error "Define a thread local storage qualifier for your compiler/platform!"
#endif

...

ATTRIBUTE_TLS static unsigned int tls_int;

似乎您可能需要将目标OS X的最低版本设置为10.7或更高版本。

Xcode 8 Beta版和GM版中包含的clang编译器支持C++11
thread\u local
关键字以及
-std=C++11
-std=C++14
(以及GCC变体)


根据,早期版本的Xcode显然支持使用关键字
\uuuuThread
\uThread\uLocal
的C风格线程本地存储(参见5:50开始的讨论).

如果您运行命令
g++-std=c++0x…
,那么您没有使用clang-您使用的是MacOS附带的非常过时的GCC版本。请尝试
clang++-std=c++11…
。我已尝试使用您建议的命令,但问题是相同的:
Pier$clang++-std=c++11-lpthread./example.c./example.c:6:1:错误:当前目标线程不支持线程本地存储。\u local int s;^
@Casey:
g++
只是OSX10.9++上的
clang++
的包装器。@Thomas他们最终抛弃了他们古老的GCC?杰出的我显然收回了我的评论。那么,你认为使用外部编译器而不是Xcode的叮当声来使用TLS是必要的,还是可能有解决方案来修复这个错误?@pier94:最好是问苹果为什么在他们的Xcode版本中禁用TLS:Ok,我已经给你发了一封电子邮件opensource@apple.com描述情况以及你所做的差异结果。如果在一周内我没有得到任何答复,我会发一封电子邮件到你写的地址。我会让你知道的@zenith:我刚刚用苹果LLVM 7.0.0版(clang-700.0.53)试用了它,事实上,
thread\u local
不起作用,即使是
libstdc++
。考虑提交一份bug报告。@泽尼斯:你可以使用巴斯宾:-)。无论如何,请看我之前的评论,我认为bug(?)又回来了。_线程在Mac OS X上也不工作,而clang在运行时也会出现同样的问题linking@AbhishekJain真奇怪。我目前正在Mac OS 10.9.5(Mavericks)上与Clang(v503.0.40)一起使用它。啊,当然,我使用的是
Clang++-stdlib=libc++-std=c++11
,所以它一定是它。对我来说,它不工作,苹果LLVM版本5.1(Clang-503.0.40)(基于LLVM 3.4svn)Clang/XCode上的本地线程和线程都不工作目标:x86_64-apple-darwin13.0.0线程模型:posix。当我使用_线程时,它会给出链接器错误:ld:目标操作系统版本不支持在推断体系结构x86_64的_Z10TMM_Mallocm中使用线程局部变量。当我使用thread_local时,它会给出编译器错误:错误:当前目标不支持线程本地存储。@AbhishekJain,这可能是由XCode的某些配置设置引起的。我通过命令行直接编译,它可以工作。试着直接在终端上运行一个简单的测试,看看它是否有效,这样你就可以缩小搜索范围。让Free/Net/OpenBSD的人作为最后一个不支持它的人。当每个人都提供一个无惩罚的本地线程时,也许有一天我们会得到一个没有GIL的Python。
#if HAS_CXX11_THREAD_LOCAL
    #define ATTRIBUTE_TLS thread_local
#elif defined (__GNUC__)
    #define ATTRIBUTE_TLS __thread
#elif defined (_MSC_VER)
    #define ATTRIBUTE_TLS __declspec(thread)
#else // !C++11 && !__GNUC__ && !_MSC_VER
    #error "Define a thread local storage qualifier for your compiler/platform!"
#endif

...

ATTRIBUTE_TLS static unsigned int tls_int;