代码之家  ›  专栏  ›  技术社区  ›  Krumelur

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

  •  4
  • Krumelur  · 技术社区  · 14 年前

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

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

    很公平,在这种情况下,pthread实际上是关闭的。问题是,有没有一种通用的方法可以使用一些宏来检测这个问题,例如ifdef GCC没有线程?

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

    这是MacOSX上的。我不确定它是不是便携式的。。。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Ben Jackson    14 年前

    您的编译命令行 -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
    
        2
  •  1
  •   Flexo - Save the data dump sunny moon    14 年前

    如果在项目中使用autoconf,您可能会发现 ax_tls.m4