JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.2: C++ ユーザーズガイド
search filter icon
search icon

ドキュメントの情報

はじめに

パート I C++ コンパイラ

1.  C++ コンパイラの紹介

2.  C++ コンパイラの使用方法

2.1 コンパイル方法の概要

2.2 コンパイラの起動

2.2.1 コマンド構文

2.2.2 ファイル名に関する規則

2.2.3 複数のソースファイルの使用

2.3 バージョンが異なるコンパイラでのコンパイル

2.4 コンパイルとリンク

2.4.1 コンパイルとリンクの流れ

2.4.2 コンパイルとリンクの分離

2.4.3 コンパイルとリンクの整合性

2.4.4 64 ビットメモリーモデル用のコンパイル

2.4.5 コンパイラのコマンド行診断

2.4.6 コンパイラの構成

2.5 指示および名前の前処理

2.5.1 プラグマ

2.5.2 可変数の引数をとるマクロ

2.5.3 事前に定義されている名前

2.5.4 警告とエラー

2.6 メモリー条件

2.6.1 スワップ領域のサイズ

2.6.2 スワップ領域の増加

2.6.3 仮想メモリーの制御

2.6.4 メモリー条件

2.7 C++ オブジェクトに対する strip コマンドの使用

2.8 コマンドの簡略化

2.8.1 C シェルでの別名の使用

2.8.2 CCFLAGS によるコンパイルオプションの指定

2.8.3 make の使用

2.8.3.1 make での CCFLAGS の使用

3.  C++ コンパイラオプションの使い方

パート II C++ プログラムの作成

4.  言語拡張

5.  プログラムの編成

6.  テンプレートの作成と使用

7.  テンプレートのコンパイル

8.  例外処理

9.  プログラムパフォーマンスの改善

10.  マルチスレッドプログラムの構築

パート III ライブラリ

11.  ライブラリの使用

12.  C++ 標準ライブラリの使用

13.  従来の iostream ライブラリの使用

14.  複素数演算ライブラリの使用

15.  ライブラリの構築

パート IV 付録

A.  C++ コンパイラオプション

B.  プラグマ

用語集

索引

2.4 コンパイルとリンク

この節では、プログラムのコンパイルとリンクについていくつかの側面から説明します。次の例では、CC を使って 3 つのソースファイルをコンパイルし、オブジェクトファイルをリンクして prgrm という実行可能ファイルを作成します。

example% CC file1.cc file2.cc file3.cc -o prgrm

2.4.1 コンパイルとリンクの流れ

前の例では、コンパイラがオブジェクトファイル (file1.ofile2.ofile3.o)を自動的に生成し、次にシステムリンカーを起動してファイル prgrm の実行可能プログラムを作成します。

コンパイル後も、オブジェクトファイル (file1.ofile2.o、および file3.o) はそのまま残りま。この規則のおかげで、ファイルの再リンクと再コンパイルを簡単に行えます。


注 - ソースファイルが 1 つだけであるプログラムに対してコンパイルとリンクを同時に行なった場合は、対応する .o ファイルが自動的に削除されます。複数のソースファイルをコンパイルする場合を除いて、すべての .o ファイルを残すためにはコンパイルとリンクを別々に行なってください。


コンパイルが失敗すると、エラーごとにメッセージが返されます。エラーがあったソースファイルの .o ファイルは生成されず、実行可能プログラムも作成されません。

2.4.2 コンパイルとリンクの分離

コンパイルとリンクは別々に行うことができます。-c オプションを指定すると、ソースファイルがコンパイルされて .o オブジェクトファイルが生成されますが、実行可能ファイルは作成されません。-c オプションを指定しないと、コンパイラはリンカーを起動します。コンパイルとリンクを分離すれば、1 つのファイルを修正するためにすべてのファイルを再コンパイルする必要はありません。次の例では、最初の手順で 1 つのファイルをコンパイルし、次の手順でそれをほかのファイルとリンクします。

example% CC -c file1.cc         Make new object file
example% CC -o prgrm file1.o file2.o file3.o       Make executable file

リンク時には (2 行目)、完全なプログラムを作成するのに必要なすべてのオブジェクトファイルを必ず 指定してください。オブジェクトファイルが足りないと、リンクは「undefined external reference (未定義の外部参照がある)」エラーで、ルーチンがないために失敗します。

2.4.3 コンパイルとリンクの整合性

コンパイルとリンクを別々に実行する場合で、「3.3.3 コンパイル時とリンク時のオプション」に示すコンパイラオプションを使用する場合は、コンパイルとリンクの整合性を保つことは非常に重大な意味を持ちます。

これらのオプションのいずれかを使用してサブプログラムをコンパイルした場合は、リンクでも同じオプションを使用してください。

次の例では、-library=stlport4 コンパイラオプションを使用してプログラムをコンパイルしています。

 example% CC -library=stlport4 sbr.cc -c
example% CC -library=stlport4 main.cc -c
example% CC -library=stlport4 sbr.o main.o -o myprogram 

-library=stlport4 を一貫して使用しない場合は、プログラムの特定の部分はデフォルトの libCstd を使用し、ほかの部分はオプションの置換である STLport ライブラリを使用します。結果として得られたプログラムは正常にリンクできず、どのような状況でも正常に動作しません。

プログラムがテンプレートを使用する場合は、リンク時にその中のいくつかがインスタンス化される可能性があります。その場合、インスタンス化されたテンプレートは最終行 (リンク行) のコマンド行オプションを使用してコンパイルされます。

2.4.4 64 ビットメモリーモデル用のコンパイル

新しい -m64 オプションを使用して、対象コンパイルのメモリーモデルを指定します。結果の実行可能ファイルは、64 ビットカーネルを実行する Solaris OS または Linux OS の配下にある、64 ビットの UltraSPARC または x86 プロセッサでのみ動作します。コンパイルリンク、および 64 ビットオブジェクトの実行は、64 ビット実行をサポートする Solaris または Linux OS でのみ行うことができます。

2.4.5 コンパイラのコマンド行診断

-V オプションを指定すると、CC によって起動された各プログラムの名前とバージョン番号が表示されます。-v オプションを指定すると、CC によって起動されたコマンド行全体が表示されます。

—verbose=%all を指定すると、コンパイラに関する追加情報が表示されます。

コマンド行に指定された引数をコンパイラが認識できない場合には、それらはリンカーオプション、オブジェクトプログラムファイル名、ライブラリ名のいずれかとみなされます。

基本的には次のように区別されます。

次の例で、-bitCC によって認識されないため、リンカー (ld) に渡されます。リンカーはこれを解釈しようとします。単一文字の ld オプションは連続して指定できるので、リンカーは -bit-b-i、-t とみなします。これらはすべて有効な ld オプションです。しかし、これは本来の意図とは異なります。

example% CC -bit move.cc           < - -bit is not a recognized CC option

CC: Warning: Option -bit passed to ld, if ld is invoked, ignored otherwise

次の例では、CC オプション -fast を指定しようとしましたが、先頭のダッシュ (-) を入力しませんでした。コンパイラはこの引数もリンカーに渡します。リンカーはこれをファイル名とみなします。

example% CC fast move.cc           < - The user meant to type -fast
move.CC:
ld: fatal: file fast: cannot open file; errno=2
ld: fatal: File processing errors. No output written to a.out

2.4.6 コンパイラの構成

C++ コンパイラパッケージは、フロントエンド (CC コマンド本体)、オプティマイザ (最適化)、コードジェネレータ (コード生成)、アセンブラ、テンプレートのプリリンカー (リンクの前処理をするプログラム)、リンクエディタから構成されています。コマンド行オプションでほかの指定を行わないかぎり、CC コマンドはこれらの構成要素をそれぞれ起動します。

これらの構成要素はいずれもエラーを生成する可能性があり、構成要素はそれぞれ異なる処理を行うため、エラーを生成した構成要素を識別することがエラーの解決に役立つことがあります。それには、-v オプションと -dryrun オプションを使用します。

次の表に示すように、コンパイラの構成要素への入力ファイルには異なるファイル名接尾辞が付いています。どのようなコンパイルを行うかは、この接尾辞で決まります。ファイル名接尾辞の意味については、表 2-1 を参照してください。

表 2-2 C++ コンパイルシステムの構成要素

コンポーネント
内容の説明
使用時の注意
ccfe
フロントエンド (コンパイラプリプロセッサ (前処理系) とコンパイラ)
iropt
コードオプティマイザ
-xO[2-5]、-fast
ir2hf
x86: 中間言語トランスレータ
-xO[2-5]、-fast
inline
SPARC: アセンブリ言語テンプレートのインライン展開
.il ファイルを指定
fbe
アセンブラ
cg
SPARC: コード生成、インライン機能、アセンブラ
ube
x86: コードジェネレータ
-xO[2-5]、-fast
CClink
テンプレートのプリリンカー
-instances=extern オプションのみで使用します。
ld
リンクエディタ