error: implicit declaration of function ‘pthread_mutexattr_settype’引き出しGNU_SOURCE探索
この2,3日64ビット移植の仕事をしていて、ある設立時報をコンパイルして次のように間違っています.
このエラーの原因は、必要なヘッダファイルが追加されていないため、関数pthread_が見つかりました.mutexattr_settypeの宣言(ファイル内):
定義がない場合USE_UNIX 98というマクロは、pthread_を宣言していません.mutexattr_settypeは、後でこの関数を使用できません.次に、資料をめくってみると、/usr/include/features.hヘッダファイルには以下のコードがあります.
コードは、_XOPEN_SOURCEの値が500以上であると定義されます.USE_UNIX 98は1なので定義できますXOPEN_SOURCEは500です.
そうすればhヘッダファイルのpthread_mutexattr_settype関数も宣言されます.
そしてhにはもう一つのコードがあります.
つまり、_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の個人ブログに変わりました
あ、注目してくれてありがとう!
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の個人ブログに変わりました
あ、注目してくれてありがとう!