TLPI 程式碼問答集
當使用提供的 makefile 編譯程式時,某些範例程式的“書籍”版本會產生以下編譯警告:
warning: "_XOPEN_SOURCE" redefined
要了解出現此警告的原因,需注意兩條有用的背景訊息:
- 本書中的所有原始碼範例都是寫出來的,因此它們預設會使用 GNU C 編譯器選項,或以下選項(對應於符合 SUSv3+C99 標準的編譯環境)進行編譯:$ cc -std=c99 -D_XOPEN_SOURCE=600
- 程式的 makefile 包含了啟用大多數可能警告的編譯器選項 (-pedantic -Wall -W)。
範例程式中使用的一些介面需要有定義 _XOPEN_SOURCE。如果使用這些介面的程式是用 -std=c99 -D_XOPEN_SOURCE=600 編譯的,那麼一切都很正常。但是,如果此類程式在編譯時沒有定義 _XOPEN_SOURCE ,但又如上所述那樣打開了警告選項,則會導致錯誤或警告(例如,諸如函數 “xxxxxx” 的隱含宣告之類的訊息)。
我為這些程式決定的解決方案是,包含一個預先處理器(preprocessor)#define 語句,它適當地定義了 _XOPEN_SOURCE。此解決方案的局限性在於,當使用 -D_XOPEN_SOURCE=600 編譯這些程式,並且原始檔案使用不同的值重新定義 _XOPEN_SOURCE 時,編譯器會發出有關重新定義的警告。
這兩個範例對於避免編譯器警告,示範了更完整的解決方案:
#ifndef _XOPEN_SOURCE
#define _XOPEN_SOURCE
#endif
#if ! defined(_XOPEN_SOURCE) || _XOPEN_SOURCE < 500
#define _XOPEN_SOURCE 500
#endif
由於代碼緊湊的原因,此方法未在「書籍」版本的程式碼中採用,但在「distribution」版本中會採用。
也可以參考 TLPI 書籍的 3.6.1 節。
如果您遇到錯誤 sys/acl.h: No such file or directory,那是因為您的系統上沒有安裝所需的 ACL套件。
在 Debian 或是 Ubuntu 系統,用如下的指令安裝應該會有用:
$ sudo apt-get install libacl1-dev
在使用 RPM 安裝套件的系統上,你會需要安裝 libacl-devel 套件。
如果你看到錯誤訊息「error sys/capability.h: No such file or directory」
這是因為你的系統沒有安裝所需的套件。在 Debian 或 Ubuntu 系統,你可以用下面的指令安裝看看,應該會有用:
$ sudo apt-get install libcap-dev
在使用 RPM 安裝套件的系統上,你會需要安裝 libcap-devel 套件。
如果你看到這個錯誤訊息「selinux/selinux.h: No such file or directory」,這是因為你的系統又有套件沒有安裝。在 Debian 或 Ubuntu 系統,你可以用下面的指令安裝看看,應該會有用:
$ sudo apt-get install libselinux1-dev