2016-05-11 49 views
5

我編譯了gnu標準庫並將其安裝在$GLIBC_INST中。爲什麼stddef.h不在/ usr/include中?

現在,我嘗試編譯非常簡單PROGRAMM(只使用一個#包括:#include <stdio.h>):

gcc --nostdinc -I$GLIBC_INST/include foo.c 

彙編(?預處理器)告訴我,它沒有找到stddef.h

事實上,$GLIBC_INST/include中沒有一個(在/usr/include中也沒有)。但是,我在/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include中發現了stddef.h

爲什麼該文件不在/usr/include下?我認爲它屬於標準C庫,應該安裝在$GLIBC_INST/include

如何編譯我的foo.c與新安裝的標準庫,當它似乎沒有與stddef.h

編輯:澄清

我覺得這個問題的標題是不是最佳的。正如一些答案指出的那樣,stddef.h不在/usr/include(或$GLIBC_INST/include)中。我明白這一點。

但我想知道如何繼續使用我想要使用的$GLIBC_INST。對我來說似乎很明顯(儘管我可能在這裏是錯誤的),我需要調用gcc與--nostdinc以便不使用系統安裝的頭文件。 這意味着我使用-I$GLIB_INST/include。這很清楚。

然而,我還不清楚的是:當我還加入-I/usr/lib/gcc/x86..../include時,我怎麼能確定我確實有新編譯的glibc的最新頭文件?

+0

您能否確認'gcc'確實指向您的5.3.0安裝,例如,使用哪個'gcc'? –

+0

如果添加'-I'選項,則編譯器在查看標準目錄之前先查看添加的包含路徑。使用'--nostdinc'你確定你正在使用新安裝的頭文件。 – LPs

+0

此外,請參閱http://stackoverflow.com/questions/31285258/why-usr-include-linux-stddef-h-is-empty –

回答

4

這是因爲/usr/include下的文件是由C庫提供的常見頭文件,例如glibc,而/usr/lib/gcc的文件是特定於該特定編譯器的文件。通常每個編譯器都有自己的不同實現stddef.h,但是當鏈接到已安裝的C庫時,它們將使用相同的stdio.h

+1

我可能會補充說'gcc --print-file-name = include'會打印路徑到'stddef.h'。 –

+0

對,gcc可以用這個選項來做到這一點。 – fluter

4

當你說#include <stddef.h>它不要求/usr/include/stddef.h作爲磁盤上的文件存在。實現所需要的只是#include <stddef.h>的工作原理,它爲您提供了頭部旨在爲您提供的功能。

在你的情況下,實現把它的一些文件放在另一個搜索路徑中。這很典型。

3

爲什麼該文件不在/usr/include下?

因爲絕對不要求標準標題位於/usr/include/

該實現可以將它們放置在任何地方。唯一的保證是 ,當你做#include <stddef.h>時,編譯器/預處理器正確定位幷包含它。由於您使用gcc的-nostdinc選項禁用了該選項,因此您需要自行確定(以正確指定該標題的位置)。