簡體   English   中英

為什么 gcc 需要 -D_GNU_SOURCE

[英]Why gcc need -D_GNU_SOURCE

當我使用選項“-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。

您需要-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 標准庫,則會在其他 Linux 變體上失敗。


非常直接的答案:

  • #define _GNU_SOURCE 1啟用 GNU C 庫支持的 GNU 擴展。 當您使用非標准函數和宏時定義它。 在您的情況下,您正在嘗試使用作為 POSIX 一部分的非標准函數,這就是您需要#define _GNU_SOURCE 1

  • 您想獲得_GNU_SOURCE的全部效果,但使 BSD 定義優先於 POSIX 定義,使用_GNU_SOURCE

查看此答案以獲取有關定義_GNU_SOURCE 的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM