<2012年12月15日>C標準ライブラリ&POSIX標準ライブラリおよびその移植

26608 ワード

LINUXプログラミングでは、ヘッダファイルに含まれる問題がよく発生しますが、これらのヘッダファイルはいったいどのパスの下にありますか?特定のヘッダファイルパスは、プログラムの性質に依存します(アプリケーションですか、カーネルに関連するプログラムですか、ローカルコンパイルですか、クロスコンパイルですか).コンパイラと、以下にそれぞれ述べる.
機械環境は以下の通り:UBUUNTU 10.04 LTSは、自分が別途インストールLINUXカーネルソースディレクトリが/usr/src/kernel、クロスリンクarm-linux-gccインストールディレクトリが/usr/lcoal/arm/2.95である.3/
【1.アプリケーションの場合、GCCを使用して通常のコンパイルを行う】コンパイル時に-Iオプションを使用してディレクトリを含むことを指定していない場合、デフォルトのヘッダファイルディレクトリは/usr/includeでshellで次のコマンドを入力できます.
  echo 'main(){}'|gcc ---
次のような出力が表示されます.
  Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure ---with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch--enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.--program-suffix=-4.--enable-nls --enable-clocale=gnu --enable-libstdcxx-debug--enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.(Ubuntu 4.4.3-4ubuntu5) 
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=i486'
 /usr/lib/gcc/i486-linux-gnu/4.4.3/cc1 --quiet -- -D_FORTIFY_SOURCE=-mtune=generic -march=i486 -fstack-protector
ignoring nonexistent directory "/usr/local/include/i486-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/i486-linux-gnu/4.4.3/http://www.cnblogs.com/http://www.cnblogs.com/i486-linux-gnu/include"
ignoring nonexistent directory "/usr/include/i486-linux-gnu"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i486-linux-gnu/4.4.3/include
 /usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
 /usr/include
End of search list.
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"
main(){}
COMPILER_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../:/lib/:/usr/lib/:/usr/lib/i486-linux-gnu/
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=i486'

内定したincludeファイルの検索パスです
  #include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i486-linux-gnu/4.4.3/include
 /usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
 /usr/include
End of search list.

実際、これらの内定したincludeファイルの検索パスは、specsファイルに格納されています.
 
【2.アプリケーションであればクロスコンパイルを採用する】コンパイル時に-Iオプションを使用してディレクトリを含むことを指定しない場合、デフォルトのヘッダファイル検索パスは/usr/local/arm/2.95.3/arm-linux/include、すなわちクロスコンパイラのインストールディレクトリの下のincludeディレクトリであり、次のコマンドを実行するecho 'main(){}'|arm-linux-gcc ---
次のような出力が表示されます.
  Reading specs from /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
 /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/cpp0 -lang---D__GNUC__=2-D__GNUC_MINOR__=95 -Dunix -D__arm__ -Dlinux -D__ELF__ -D__unix__ -D__arm__ -D__linux__-D__ELF__ -D__unix -D__linux -Asystem(unix) -Asystem(posix) -Acpu(arm) -Amachine(arm)-D__CHAR_UNSIGNED__ -D__ARM_ARCH_3__ -D__APCS_32__ -
GNU CPP version 2.95.3 20010315 (release) (ARM GNU/Linux with ELF)
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/include
 /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/sys-include
 /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/include
End of search list.
The following default directories have been omitted from the search path:
 /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../include/g++-3
End of omitted list.
# 1 ""
main(){}

内定したincludeファイルの検索パスです
  #include "..." search starts here:
#include <...> search starts here:
 /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/include
 /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/sys-include
 /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/include
End of search list.

すなわち、クロスコンパイルを採用する場合、アプリケーションに含まれるヘッダファイルは、クロスコンパイラのインストールディレクトリの下にあります.
【3.カーネル関連のプログラムである場合】例えばドライバであれば、含まれるヘッダファイルはカーネルソースのインストールディレクトリ、すなわち/usr/src/kernel/includeである.この場合、Makefileファイルにカーネルソースディレクトリを指定し、コンパイル時にINCLUDEディレクトリを指定するのが一般的である.
http://blogold.chinaunix.net/u3/119151/showart_2342316.html記事のMakefileファイルの内容
 
【4.まとめ】:
ncludeのheaderファイル、データベース、システム定義を連結し、次のソース指定コンパイラが探しています.当初コンパイル時に指定する(~gcc/gcc/collect 2.c:locatelib()は、specs内に書かれた後に-D-I-Lで指定するgcc環境変数で設定(コンパイル時)ld.soの環境変数(run timeの場合)
========================================================================
C言語プログラミングでは、C標準関数ライブラリ(C Standard library)は、I/O入出力や文字列制御など、現在標準に準拠しているすべてのヘッダファイル(head file)を収集し、よく使われている関数ライブラリ実装プログラムを収集する.1995年、Normative Addendum 1(NA 1)は、3つのヘッダファイル(iso 646.h,wchar.h,and wctype.h)をC標準関数ライブラリに追加した.C 99規格は6つのヘッダファイル(complex.h,fenv.h,inttypes.h,stdbool.h,stdint.h,and tgmath.h)を追加した.C 11規格にはさらに5つのヘッダファイル(stdalign.h,stdatomic.h,stdnoreturn.h,threads.h,and uchar.h)が追加された.これで、C標準関数ライブラリは29個のヘッダファイルになります.
名前
ソース
説明<assert.h>
 
Contains the assert macro, used to assist with detecting logical errors and other types of bug in debugging versions of a program. <complex.h>
C99
A set of functions for manipulating  複数 . <ctype.h>
 
Defines set of functions used to classify characters by their types or to convert between upper and lower case in a way that is independent of the used character set (typically  ASCII  or one of its extensions, although implementations utilizing  EBCDIC  are also known). <errno.h>
 
For testing error codes reported by library functions. <fenv.h>
C99
Defines a set of functions for controlling  浮動小数点数  environment. <float.h>
 
Defines macro constants specifying the implementation-specific properties of the  浮動小数点数  library. <inttypes.h>
C99
Defines exact width integer types. <iso646.h>
NA1
Defines several macros that are equivalent to some of the operators in C. For programming in  ISO 646  variant character sets. <limits.h>
 
Defines macro constants specifying the implementation-specific properties of the integer types. <locale.h>
 
Defines C localization functions. <math.h>
 
Defines C mathematical functions. <setjmp.h>
 
Declares the macros  setjmp  and  longjmp , which are used for non-local exits. <signal.h>
 
Defines C signal handling functions. <stdalign.h>
C11
For querying and specifying the data structure alignment of objects. <stdarg.h>
 
For accessing a varying number of arguments passed to functions. <stdatomic.h>
C11
For atomic operations on data shared between threads. <stdbool.h>
C99
Defines a boolean data type. <stddef.h>
 
Defines several useful types and macros. <stdint.h>
C99
Defines exact width integer types. <stdio.h>
 
Defines core input and output functions <stdlib.h>
 
Defines numeric conversion functions, pseudo-random numbers generation functions, dynamicmemory allocation, process control functions <stdnoreturn.h>
C11
For specifying non-returning functions. <string.h>
 
Defines C string handling functions. <tgmath.h>
C99
Defines type-generic mathematical functions. <threads.h>
C11
Defines functions for managing multiple threads as well as mutexes and condition variables.
 
 
Defines date and time handling functions <uchar.h>
C11
Types and functions for manipulating  Unicode  characters. <wchar.h>
NA1
Defines wide string handling functions. <wctype.h>
NA1
Defines set of functions used to classify wide characters by their types or to convert between upper and lower case
 
 ============================================================
POSIX標準定義ヘッダファイル
ディレクトリ項目
ファイル制御
ファイル名マッチングタイプ
パス名パターンマッチングタイプ
グループファイル
ネットワークデータベース操作
パスワードファイル
正規表現
TARアーカイブ値
端末I/O
シンボル定数
ファイル時間
文字拡張タイプ
-------------------------
INTERNET定義
ソケットローカルインタフェース
INTERNETアドレスファミリー
転送制御プロトコル定義
-------------------------  
メモリ管理宣言
Select関数
ソケット言い訳
ファイル状態
プロセス時間
基本システムデータ型
UNIXドメインソケット定義
システム名
プロセス制御
 
------------------------------
POSIX定義XSI拡張ヘッダファイル
cpioアーカイブ値
ダイナミックリンク
メッセージ表示構造
ファイルツリーウォーク
コードセット変換ユーティリティ
言語情報定数
モードマッチング関数定義
通貨タイプ
データベース操作
メッセージカテゴリ
ポーリング関数
検索テーブル
文字列操作
システムエラーログ
ユーザコンテキスト
ユーザ制限
ユーザーアカウントデータベース
-----------------------------
IPC(名前付きパイプ)
メッセージキュー
リソースアクション
信号量
共有ストレージ
ファイルシステム情報
時間タイプ
日付と時刻の追加定義
ベクトルI/O操作
 
------------------------------
POSIX定義のオプションヘッダファイル
非同期I/O
メッセージキュー
スレッド
スケジュールの実行
信号量
リアルタイムspawnインタフェース
XSI STREAMSインタフェース
イベントトラッキング
C 99増加分include複素処理#include浮動小数点環境#include整数フォーマット変換#includeブール環境#include整型環境#include汎用型数学マクロ