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

pthread_setname_np函数 阅读详情

这两天在做64位移植的工作,在编译某组建时报错如下:

error: implicit declaration of function ‘pthread_mutexattr_settype’


造成这个错误的原因网上已经说得很明白了,就是由于没有添加所需要的头文件导致的,于是找到了函数pthread_mutexattr_settype的声明(在 <pthread.h> 文件中):

#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_UNIX98这个宏,那就没有声明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_UNIX98为1,所以我们可以定义_XOPEN_SOURCE为500。
这样的话,pthread.h头文件中的pthread_mutexattr_settype函数也就会被声明。


而features.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 的个人博客 ,谢谢关注!


pthread_setaffinity_np()函数 【代码】pthread_setaffinity_np()函数。pthread_setaffinity_np()函数是一个在多线程编程中用于设置线程亲和性(Thread Affinity)的函数。它允许程序员将一个线程绑定到特定的 CPU 核心(或核心集合)上运行,这在优化多线程程序性能、提高缓存利用率以及确保特定线程在特定硬件资源上运行等方面非常有用。 简单来说,这个函数就像是一个调度员,它可以指定某个线程在哪个(些)CPU “工作岗位” 上干活。 阅读详情

相关推荐

错误解决:implicit declaration of function 警告解决方法 (函数的隐式说明)

2 在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明。1 没有把函数所在的c文件生成.o目标文件。有两种情况会产生这种情况。

CodeAllen嵌入式 18万+

implicit declaration of function解决

编译中遇到warning:implicit declaration of function…主要考虑方向: 1.函数是否在c文件中存在定义。 2.在c文件定义的情况下相应的h文件中是否有声明。 3.在c文件和h文件都无问题的情况下,include是否正确。 4.考虑函数参数传递问题。以上方法都检查了,没有发现问题,纠结了好久,实在不知道是哪里的问题,之后尝试在提示warning的.c文件对应的h文件中加入extern+函数类型+函数名;warning消失,点击可以正常跳转至函数页面。得出结论:如果无上述四个

m0_50262974的博客 7410

解决“warning: implicit declaration of function xxx“的错误

一般报错如下图所示: 解决办法:在main函数之前声明一下这个函数即可,但注意并不需要定义这个函数。 如图所示 这样问题就解决啦!

a2370530873的博客 3137

解决C语言函数调用warning: implicit declaration of function ‘‘

显示这类错误很大可能性是调用函数时出现纰漏,一般常见错误原因是先写了主函数(主函数位置在最前),然后在主函数里调用了其他函数,但是这样调用的话先运行的是主函数,但是主函数里的别的函数名系统在运行时根本无法识别,所以才会报错。问题:warning: implicit declaration of function ‘’函数本应该定义在前,调用在后,但若要执意要实现调用在前,定义在后则需要加上对该函数的声明。//分号一定不要忘记,是特色,也可以选择性省略形参(只用数据类型)

xiaobai729的博客 11万+

【转】implicit declaration of function 这种警告问题的原因及解决方法

在改掉所有的warning时老报一个implicit declaration of function 的警告错误,上网查了下原因,原来有两种情况会产生这种情况 1没有把函数所在的c文件生成.o目标文件。2在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明。 3 其头文件都声明过了,所调用的函数的原型与所传的实参类型不匹配。 我的情况: ...

2万+

sigset() -- sinal 的可靠对应函数

sigset() -- sinal 的可靠对应函数 sigset()函数是 signal()函数的可靠对应函数,其声明为: #include typedef void (*sighandler_t)(int); sighandler_t sigset(int sig, sighandler_t disp); sigset() 函数将 sig 指定的信号部署改

mwx1234的专栏 1万+

解决编译错误implicit declaration of function ‘strptime‘-- ‘PTHREAD_MUTEX_RECURSIVE‘ undeclar

-D_GNU_SOURCE用于在编译时告诉 GCC(GNU Compiler Collection)启用 GNU 扩展,解决某些编译报错问题

qq_42288975的博客 555

C语言函数隐式声明——implicit declaration warning

implicit declaration of function——函数隐式声明警告 原因: 1、该函数未被声明,但却被调用了,此时gcc会报这样的警告信息。 2、(网友总结)该函数所在源文件没有被编译为.o二进制文件。 解决办法: 1、在调用之前先声明这个函数,一般使用extern关键字(该关键字非必需)    声明函数可以不加extern,函数默认extern;声明变量必须要加extern...

团长的专栏 4万+

【Linux】vscode 对 pthread_rwlock_t 等报错 解决方法

在Linux环境下使用 VScode 编写C代码,在进行关于进程、现程开发的时候,一些系统调用或者定义(比如像等) 编辑器都无法解析出来,经常会出现无法跳转函数定义、飘红等,除了没有 include 相关的头文件之外,很可能是没有进行宏定义导致的 VScode 解析器无法识别。

weixin_46512400的博客 1907

C 语言 implicit declaration of function 错误原因

<br />关于 implicit declaration of function 一点经验之谈<br /><br /> 用gcc编译c程序的时候 经常会出现<br /> implicit declaration of function '...' 的warning<br /><br /> 偶经过这几天的经验,发现主要有2种情况会产生这种warning<br /><br /> 1   没有把函数所在的c文件生成.o目标文件<br /> 2   在函数所在的c文件中定义了,但是没有在与之相关联的.h

yel617的专栏 6万+

pthread_setname_np 线程设置名字 c++

可以通过命令cat /proc/pid/task/[tid]/comm来查看线程名称。成功时,这些函数返回 0;出错时,它们返回一个非零错误号。线程设置名称,其长度限制为 16 个字符(含\0在内)

sun007700的专栏 1190

implict declaration

GCC make 工具  裸机 2451 Test-backlight-1wire.c: In function 'Backlight_1wire_Test': Test-backlight-1wire.c:15: warning: implicit declaration of function 'printf' 加入  #include "printf.h" 报错找不

凉风习习的博客 505

implicit declaration of function 的原因以及解决方法

文章目录报错:原因:解决方法:结果: 报错: 原因: 没有把函数所在的.c文件生成.o目标文件; 在函数所在的.c文件中声明了函数,但是没有在与之相关联的.h文件中声明 解决方法: 在需要调用该函数的文件中声明该函数; 也可在相应.h文件中声明函数 结果: 成功解决 ...

冰糖的博客 7万+

LINUX下警告, 错误解决

1.warning: implicit declaration of function pthread_mutexattr_settypePlease use -D_XOPEN_SOURCE=500 or -D_GNU_SOURCE for your compilation option. 2.clock_gettime未定义的引用加一个库就行了 -lrt

虚拟化开发 1258

implicit declaration of function解决方法

产生implicit declaration of function的原因 1 没有把函数所在的c文件生成.o目标文件。 2 在函数所在的c文件中定义了,但是没有在与之相关联的.h文件中声明。 3 其头文件都声明过了,所调用的函数的原型与所传的实参类型不匹配。 一般最常出现的是第二种, function()函数在A.c文件中写了功能,但未在A.h文件中进行声明该函数。B在文件中使用该函数时,...

yigedaluobo的博客 3万+

初出茅庐的小李第44篇博客之implicit declaration of function 警告解决方法 (函数的隐式说明)

警告如下 原因 是因为函数没有在头文件(.h)定义,这就导致编译的时候没法正确生成.o文件 处理 声明一下 结果

初出茅庐的小李 2183

implicit declaration of function 这种警告问题的原因及解决方法

http://blog.csdn.net/fpmystar/article/details/4168073 缺少头文件 最近在改进SD卡的SEP4020驱动时,在改掉所有的warning时老报一个implicit declaration of function 的警告错误,上网查了下原因,原来有两种情况会产生这种情况 1 没有把函数所在的c文件生成.o目标文件 2 在函数所在的c文件中

chengfangang的专栏 3万+

pthread_mutexattr_t设置的相关函数及其说明

基本概述 该函数用于C函数的多线程编程中,互斥锁的初始化。  头文件:#include <pthread.h> 函数原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_init()函数是以动态方式创建互斥锁..

zz460833359的博客 2258
上一篇: Debian 6,使用 insserv 代替 update-rc.d
下一篇: Linux下清除缓存 drop_caches,sysctl(备忘)
Joe_vv
博客等级 码龄15年 100粉丝 49原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值