【问题标题】:Why gcc need -D_GNU_SOURCE为什么 gcc 需要 -D_GNU_SOURCE
【发布时间】:2018-05-12 21:14:32
【问题描述】:

当我使用选项“-L”制作gcc编译命令时,我应该添加gblic库路径或添加-D_GNU_SOURCE,否则gcc会运行错误。

$gcc sscanf_test.c -I/si/usr/aa/include/arch -o sscanf_test_2  -m64  -L$ORACLE_HOME/precomp/lib/ -L$ORACLE_HOME/lib/ -L$ORACLE_HOME/lib/stubs/ -lc
$/tmp/ccq1Z6T1.o:function ‘main’:
  sscanf_test.c:(.text+0x32):undefined reference to ‘__isoc99_sscanf’
  sscanf_test.c:(.text+0xf8):undefined reference to ‘__isoc99_sscanf’
  sscanf_test.c:(.text+0x1e4):undefined reference to ‘__isoc99_sscanf’
  collect2: ld return 1
$gcc sscanf_test.c -I/si/usr/aa/include/arch -o sscanf_test_2  -m64  -L$ORACLE_HOME/precomp/lib/ -L$ORACLE_HOME/lib/ -L$ORACLE_HOME/lib/stubs/ -D_GNU_SOURCE
$gcc sscanf_test.c -I/si/usr/aa/include/arch -o sscanf_test_2  -m64  -L$ORACLE_HOME/precomp/lib/ -L$ORACLE_HOME/lib/ -L$ORACLE_HOME/lib/stubs/ /lib64/libc.so.6

现在,我很困惑为什么 gcc 需要 -D_GNU_SOURCE。另一台具有类似环境的机器可以在没有 -D_GNU_SOURCE 的情况下正常运行。

【问题讨论】:

  • 什么是gblic?你的意思是glibc
  • @SouravGhosh 我的意思是 GNU C 库下所有其他标准的超集。
  • 为什么是这个 C++1 标签?这和 C++ 有什么关系?
  • @hrl,gcc 是编译器 C++ 是编程语言。一个怎么可能是另一个? gcc 是多种语言的编译器,其中包括 C 和 C++。

标签: c gcc glibc


【解决方案1】:

您需要-D_GNU_SOURCE 才能使用 GNU 扩展特性/功能。可以使用socketifconfig等低级函数。

宏:_GNU_SOURCE 如果您定义此宏,则所有内容都包括在内: ISO C89、ISO C99、POSIX.1、POSIX.2、BSD、SVID、X/Open、LFS 和 GNU 扩展名。在 POSIX.1 与 BSD 冲突的情况下,POSIX 定义优先。

不使用-D_GNU_SOURCE 进行编译可能在一台 Linux 机器上运行没有任何问题,但如果其他 Linux 变体使用不同的 C 标准库,则它们会失败。


非常直接的答案:

  • #define _GNU_SOURCE 1 启用 GNU C 库支持的 GNU 扩展。在使用非标准函数和宏时定义它。在您的情况下,您正在尝试使用属于 POSIX 的非标准函数,这就是您需要 #define _GNU_SOURCE 1 的原因。

  • 您想获得_GNU_SOURCE 的全部效果,但要制作BSD 定义优先于 POSIX 定义,使用 _GNU_SOURCE

查看此答案以获取有关定义 _GNU_SOURCE. 的更多信息

【讨论】:

  • 这是大错特错。首先,它是-D_GNU_SOURCE,而不是-DGNU_SOURCE-GNU_SOURCE。其次,头文件位于/usr/include,而不是/usr/lib
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 2019-06-09
  • 2018-10-29
  • 2014-12-05
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多