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

时间:2010-11-01 17:59:25

标签: c++ gcc portability thread-local

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

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

考虑到在这种情况下pthreads实际上已关闭,这是公平的。问题是,是否存在使用某些宏检测此问题的通用方法,例如#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上。我不确定它是否可携带或任何东西......

2 个答案:

答案 0 :(得分:6)

您的编译命令行是否有-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

答案 1 :(得分:1)

如果您为项目使用autoconf,您可能会发现ax_tls.m4有用。