博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于__GNU_SOURCE 这个宏---如何开启【转】
阅读量:6897 次
发布时间:2019-06-27

本文共 2156 字,大约阅读时间需要 7 分钟。

今天发现一个奇怪的问题,即使

#include sys/stat.h
在使用  lstat 函数的时候还是会报
warning: implicit declaration of function 'lstat'

另外同样的问题,即使include 了 sys/time.h

还是会报
warning: implicit declaration of function 'nanosleep'

同样,即使include 了 sys/time.h  time.h
warning: implicit declaration of function 'clock_gettime'
error: 'CLOCK_MONOTONIC' undeclared (first use in this function)

最后发现 sys/time.h sys/stat.h time.h 都include 一个共同的头文件 features.h

原来这是用来让用户配置编译环境的头文件。再看一下_GUN_SOURCE这个宏,这个宏可以让用户打开所有feature.

/* 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 200112L
# undef  _XOPEN_SOURCE
# define _XOPEN_SOURCE 600
# 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
   
因此解决问题的办法很简单
只要在source file的开头 加上
#define _GNU_SOURCE
就可以了。

另外必须注意include 的先后次序
#include time.h
#include sys/time.h
顺序搞反了的话 clock_gettime CLOCK_MONOTONIC 是编译无法通过的。这是因为time.h是标准头文件
,而sys/time.h 是你当前系统的头文件。

 
 
转自:

在编写网络程序时,会涉及到一些关于BSD系统保留下的结构体和宏定义,关于一切配置在linux系统的/usr/include/features.h文件中,开启项如下:

#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        199506L
# undef  _XOPEN_SOURCE
# define _XOPEN_SOURCE  600
# 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
#endif
可以看出只要开启了_GNU_SOURCE的花,大部分的BSD功能可以打开,看看_GNU_SOURCE是否开启有一个测试程序:

#include <iostream>

int main()
{
#ifdef _GNU_SOURCE
  std::cout << "gnu/n";
#else
  std::cout << "non-gnu/n";
#endif
}
只要gcc -D _GNU_SOURCE test.c -o test.o编译生成的text.o文件,运行一下就知道是否开启了

本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5649171.html,如需转载请自行联系原作者

你可能感兴趣的文章
No bean named &#39;transactionManager&#39; is defined
查看>>
spring cloud config 入门
查看>>
[20171110]toad 小技巧.txt
查看>>
C#开发SQLServer的Geometry和Geography存储
查看>>
策略模式(Strategy Pattern)
查看>>
非root用户挂载nfs
查看>>
云效【Work Like Alibaba线下沙龙】“业务为王”时代,DevOps怎么玩?
查看>>
我的Android进阶之旅------&gt;关于使用Android Studio替换App的launcher图标之后仍然显示默认的ic_launcher图标的解决方法...
查看>>
Linux下GPIO驱动
查看>>
C#中各种计时器 Stopwatch、TimeSpan
查看>>
我的Java开发学习之旅------&gt;解惑Java进行三目运算时的自动类型转换
查看>>
mybatis 使用经验小结
查看>>
Android 随笔——Android必须知道的注解Annotations
查看>>
关于iOS11中estimatedRowHeight属性
查看>>
Zookeeper源码分析-数据模型
查看>>
折腾Java设计模式之解释器模式
查看>>
设计模式命令模式(行为型)
查看>>
RN开发快速切换底部导航时react-native-swiper轮播图组件白屏
查看>>
sublime px -> rem sass
查看>>
瀑布流照片墙布局
查看>>