编译问题:对pthread_cleanup_push_defer_np()和pthread_cleanup_pop_restore_np()的未定义引用

时间:2014-10-27 15:17:33

标签: c compiler-errors pthreads

我目前正在编写一个带有线程的C程序,我使用pthread_cleanup_push_defer_np()pthread_cleanup_pop_restore_np()。条件是:

  • 我已加入pthread.h;
  • 我正在使用-pthread选项进行编译;
  • 我在Ubuntu 14.04并使用gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1);

编译时我回到上面提到的函数的一个讨厌的未定义引用错误,我无法弄清楚原因。我试着看看pthread.h,似乎这两个函数被注释掉了,所以我想知道我是否需要以某种方式启用它们或者使用其他类型的选项。我已阅读手册页并进行谷歌搜索,但我无法找到解决方案,所以我希望得到一些帮助。这是一个片段:

    void *start_up(void *arg)
    {
        char *timestamp;
             // ... code ...
        timestamp = get_current_timestamp("humread"); 
        pthread_cleanup_push_defer_np(free, timestamp);
            // ... some other code
        pthread_cleanup_pop_restore_np(1);
           // ... more code ...
    }

我用

编译
gcc -pthread -o server *.c

1 个答案:

答案 0 :(得分:1)

pthread_cleanup_push_defer_np and pthread_cleanup_pop_restore_np的手册说这两个(非便携式)功能是GNU扩展并且已启用 通过定义_GNU_SOURCE

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       pthread_cleanup_push_defer_np(), pthread_cleanup_pop_defer_np():
           _GNU_SOURCE

这导致链接器错误(与编译时错误相反),因为您的编译器是C99之前的版本(或者您正在以C99之前的模式进行编译)并且默认情况下假定这些函数返回int

规则 functions-return-int 如果没有原型,则自C99以来已被删除。启用更多编译器开关可以帮助您进行更好的诊断。