ディレクトリ探索用のオプションについて説明と検証を行います.
● -Idir
探索するディレクトリの一覧の先頭にディレクトリdirを追加します.これはヘッダファイルを見つけるためのものです.
これらのディレクトリは,システムヘッダファイルのディレクトリよりも前に探索されます.
使用例としては,このオプションを使って,システムヘッダファイルを無効にし,ユーザーが独自に作成したヘッダファイルで置き換えることができます.
ここで使うソースはtest30.cと同じで,マクロであるTESTMACROの値を表示するだけのものです.作業ディレクトリ直下にworkという名前でディレクトリを作成します.
その後,/user/includeからstdio.hをコピーして先頭行に独自に,
#define TESTMACRO 999
と付加します(リスト13).
〔リスト13〕独自に作成したヘッダファイル(stdio.h)
|
#define TESTMACRO 999 //独自に付加した行
/* Define ISO C stdio on top of C++ iostreams.
Copyright (C) 1991, 1994-1999, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
/*
* ISO C99 Standard: 7.19 Input/output <stdio.h>
*/
#ifndef _STDIO_H
#if !defined __need_FILE && !defined __need___FILE
# define _STDIO_H 1
# include <features.h>
__BEGIN_DECLS
# define __need_size_t
# define __need_NULL
# include <stddef.h>
# include <bits/types.h>
# define __need_FILE
# define __need___FILE
#endif /* Don't need FILE. */
#if !defined __FILE_defined && defined __need_FILE
/* The opaque type of streams. This is the definition used elsewhere. */
typedef struct _IO_FILE FILE;
# define __FILE_defined 1
#endif /* FILE not defined. */
#undef __need_FILE
#if !defined ____FILE_defined && defined __need___FILE
/* The opaque type of streams. This is the definition used elsewhere. */
typedef struct _IO_FILE __FILE;
# define ____FILE_defined 1
#endif /* __FILE not defined. */
#undef __need___FILE
//以下省略
|
|
その実行結果は,以下のようになります.
$ gcc -Iwork test30.c
$ ./a.out
999
$
● -I
先に-Iオプションにより指定されたディレクトリは,ソース中で#include "file"という記述で組み込まれるヘッダファイルについてのみ探索されます.
このとき#include <file>という形式で組み込まれるヘッダファイルについては探索されません.
-Iは,ヘッダファイルの探索に標準システムディレクトリを使うことを禁止するものではありません,よって-Iと-nostdincは干渉しません.
● -Ldir
-lにより指定されるライブラリを見つけるために探索されるディレクトリの一覧にディレクトリdirを追加します.
たとえばX Window Systemのライブラリは/usr/lib/X11にありますが,それをリンクする場合には-L/usr/lib/X11と指定します.
● -Bprefix
このオプションは,コンパイラ自身の実行可能ファイル,ライブラリ,インクルードファイル,データファイルがどこにあるかを指定するものです.
コンパイラドライバプログラムは,サブプログラムcpp,cc1,as,ldを一つ以上実行します.コンパイラドライバプログラムは,実行しようとする個々のプログラムの名前の接頭語として,machine/version/を付加したprefixとmachine/version/を付加しないprefixの両方を試しに使ってみます(後述するターゲットマシンとコンパイラバージョンの指定を参照).
-Bが指定されている場合には,コンパイラドライバは,実行される個々のサブプログラムについて,まず-Bにより指定されている接頭語を試します.そのファイル名のファイルが見つからない場合,あるいは-Bが指定されていない場合,ドライバは二つの標準接頭語を試します.それらは,/usr/lib/gcc/と/usr/local/lib/gcc-lib/です.これらを使ったファイル名のファイルがいずれも見つからない場合には,PATH環境変数に指定されているディレクトリを使って,何の変更も加えないプログラム名でファイルを探します.ディレクトリ名を指定する-Bの接頭語は,リンカにおけるライブラリ名にも適用されます.コンパイラがこのオプションを使ってリンカ用の-Lオプションを作成するからです.
また,コンパイラがこのオプションを使ってプリプロセッサ用の-isystemオプションを作成するので,同じ接頭語がプリプロセッサにおけるインクルードファイル名にも適用されます.この場合,コンパイラは,接頭語の後にincludeを付加します.
必要であれば,実行時サポートファイルlibgcc.aもまた,-Bの接頭語を使って探すことができます.しかし,ファイル名だけでは見つからない場合に,上記の二つの標準接頭語が試されます.これら二つの名前によってもファイルが見つからない場合には,このファイルはリンクの対象外となります.-Bによる接頭語とほぼ同様の接頭語を指定する別の方法に,環境変数GCC_EXEC_PREFIXを使うという方法があります.後述する「GCCに影響を与える環境変数」を参照してください.
● -specs=file
コンパイラが標準のspecsファイルを読み込んだあとで,fileを処理します.その目的は,gccドライバプログラムがcc1,cc1plus,as,ldなどに渡すオプションを決定する際に使うデフォルトの設定を無効にすることです.コマンドライン上において複数の-specs=fileを指定することができ,その場合,左から右の順序で処理されます.specsについては本誌2002年8月号で説明しましたが,ユーザー共通のオプションを指定するファイルです.デフォルトのspecsは/usr/lib/gcc-lib/i586-pc-Linux/2.95.3(Turbolinux7の場合)にあります.-specsの後にファイル名を指定すれば,そのファイル中に記述されたオプションが使用されます.
|