繁体   English   中英

“此目标不支持线程本地存储”,是否适合#ifdef?

[英]“thread-local storage not supported for this target”, suitable #ifdef?

由于每个编译器都有自己的线程本地存储版本,因此我最终为其创建了一个宏。 现在唯一的问题是GCC(关闭了pthreads),这给了我:

“此目标不支持线程本地存储”

考虑到在这种情况下实际上已关闭了pthread,这很公平。 问题是,是否存在使用某些宏(例如#ifdef __GCC_XXX_NO_THREADS_XXX)检测到此错误的通用方法?

编辑:请参阅下面接受的答案。 另外,这是我的懒惰解决方案:


$ touch test.c
$ gcc -E -dM test.c > out.1
$ gcc -pthread -E -dM test.c > out.2
$ diff out.*
28a29
> #define _REENTRANT 1

这是在Mac OS X上。我不确定它是否是便携式的或其他任何东西。

您的编译命令行中是否包含-lpthread :您也可以在其中包含-DHAVE_PTHREADS

如果您确实想要特定于GCC / ELF的运行时检测,则可以使用弱引用:

#include <pthread.h>

extern void *pthread_getspecific(pthread_key_t key) __attribute__ ((weak));

int
main()
{
    if (pthread_getspecific)
        printf("have pthreads\n");
    else
        printf("no pthreads\n");
}

看起来是这样的:

$ gcc -o x x.c
$ ./x
no pthreads
$ gcc -o x x.c -lpthread
$ ./x
have pthreads

如果将autoconf用于项目,则可能会发现ax_tls.m4有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM