error: implicit declaration of function ‘pthread_mutexattr_settype’引き出しGNU_SOURCE探索


この2,3日64ビット移植の仕事をしていて、ある設立時報をコンパイルして次のように間違っています.
error: implicit declaration of function ‘pthread_mutexattr_settype’

このエラーの原因は、必要なヘッダファイルが追加されていないため、関数pthread_が見つかりました.mutexattr_settypeの宣言(ファイル内):
#ifdef __USE_UNIX98
/* Return in *KIND the mutex kind attribute in *ATTR.  */
extern int pthread_mutexattr_gettype (__const pthread_mutexattr_t *__restrict __attr, int *__restrict __kind)
    __THROW;

/* Set the mutex kind attribute in *ATTR to KIND (either PTHREAD_MUTEX_NORMAL,
   PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_ERRORCHECK, or
   PTHREAD_MUTEX_DEFAULT).  */
extern int pthread_mutexattr_settype (pthread_mutexattr_t *__attr, int __kind)
    __THROW;

/* Return in *PROTOCOL the mutex protocol attribute in *ATTR.  */
extern int pthread_mutexattr_getprotocol (__const pthread_mutexattr_t *__restrict __attr, int *__restrict __protocol)
    __THROW;

/* Set the mutex protocol attribute in *ATTR to PROTOCOL (either
   PTHREAD_PRIO_NONE, PTHREAD_PRIO_INHERIT, or PTHREAD_PRIO_PROTECT).  */
extern int pthread_mutexattr_setprotocol (pthread_mutexattr_t *__attr, int __protocol)
    __THROW;

/* Return in *PRIOCEILING the mutex prioceiling attribute in *ATTR.  */
extern int pthread_mutexattr_getprioceiling (__const pthread_mutexattr_t *__restrict __attr, int *__restrict __prioceiling)
    __THROW;

/* Set the mutex prioceiling attribute in *ATTR to PRIOCEILING.  */
extern int pthread_mutexattr_setprioceiling (pthread_mutexattr_t *__attr, int __prioceiling)
    __THROW;
#endif

定義がない場合USE_UNIX 98というマクロは、pthread_を宣言していません.mutexattr_settypeは、後でこの関数を使用できません.次に、資料をめくってみると、/usr/include/features.hヘッダファイルには以下のコードがあります.
#ifdef  _XOPEN_SOURCE
#     define __USE_XOPEN    1
#     if (_XOPEN_SOURCE - 0) >= 500
#         define __USE_XOPEN_EXTENDED  1
#         define __USE_UNIX98  1
#         undef _LARGEFILE_SOURCE
#         define _LARGEFILE_SOURCE     1
#         if (_XOPEN_SOURCE - 0) >= 600
#             if (_XOPEN_SOURCE - 0) >= 700
#                 define __USE_XOPEN2K8      1
#             endif
#             define __USE_XOPEN2K        1
#             undef __USE_ISOC99
#             define __USE_ISOC99         1
#         endif
#     else
#         ifdef _XOPEN_SOURCE_EXTENDED
#             define __USE_XOPEN_EXTENDED 1
#         endif
#     endif
#endif

コードは、_XOPEN_SOURCEの値が500以上であると定義されます.USE_UNIX 98は1なので定義できますXOPEN_SOURCEは500です.
そうすればhヘッダファイルのpthread_mutexattr_settype関数も宣言されます.
そしてhにはもう一つのコードがあります.
/* If _GNU_SOURCE was defined by the user, turn on all the other features.  */
#ifdef _GNU_SOURCE
# undef  _ISOC99_SOURCE
# define _ISOC99_SOURCE 1
# undef  _POSIX_SOURCE
# define _POSIX_SOURCE  1
# undef  _POSIX_C_SOURCE
# define _POSIX_C_SOURCE        200809L
# undef  _XOPEN_SOURCE
# define _XOPEN_SOURCE  700
# undef  _XOPEN_SOURCE_EXTENDED
# define _XOPEN_SOURCE_EXTENDED 1
# undef  _LARGEFILE64_SOURCE
# define _LARGEFILE64_SOURCE    1
# undef  _BSD_SOURCE
# define _BSD_SOURCE    1
# undef  _SVID_SOURCE
# define _SVID_SOURCE   1
# undef  _ATFILE_SOURCE
# define _ATFILE_SOURCE 1
#endif

つまり、_GUN_SOURCEマクロが定義されると、上記のいくつかのマクロが定義され、定義されます.XOPEN_SOURCEは700で、ちょうど定義を満たしています_GNU_SOURCEマクロの条件.マクロを定義することもできますGNU_SOURCE.
以上、コンパイル時にコンパイルオプションを追加します.
-D_XOPEN_SOURCE=500または
-D_GNU_SOURCEで解決できます.
もう一つの方法はerror:implicit declaration of function'pthread_mutexattr_settype'エラーは、コンパイル時にコンパイルオプション「-Werror-implicit-function-declaration」を削除すればよいのですが、このオプションを削除するのはお勧めしません!
ブロガーのすべての文章は利己的なブログJoeの個人ブログに変わりました
あ、注目してくれてありがとう!