サーチ…
前書き
C ++で書かれたプログラムは、実行する前にコンパイルする必要があります。オペレーティングシステムによっては、さまざまな種類のコンパイラが用意されています。
備考
ほとんどのオペレーティングシステムはコンパイラなしで出荷され、後でインストールする必要があります。一般的なコンパイラの選択肢は次のとおりです。
- GCC、GNUコンパイラ・コレクション g ++
- clang:LLVM clang ++の C言語ファミリのフロントエンド
- MSVC、Microsoft Visual C ++(Visual Studioに付属) visual-c ++
- C ++ Builder、Embarcadero C ++ Builder (RAD Studioに付属) c ++ビルダー
C ++プログラムのコンパイル方法については、適切なコンパイラマニュアルを参照してください。
特定のコンパイラを独自の特定のビルドシステムで使用する別のオプションとして、汎用ビルドシステムに特定のコンパイラまたはデフォルトのインストールされたもの用にプロジェクトを設定させることができます。
GCCでコンパイルする
main.cpp
という名前の単一のソースファイルを仮定すると、最適化されていない実行可能ファイルをコンパイルしてリンクするコマンドは次のようになります(最適化なしのコンパイルは最初の開発とデバッグには便利ですが、新しいGCCバージョンでは-Og
が正式に推奨されます)。
g++ -o app -Wall main.cpp -O0
本番環境で使用する最適化された実行可能ファイルを生成するには、 -O
オプションの1つを使用します( -O1
、 -O2
、 -O3
、 -Os
、 -Ofast
)。
g++ -o app -Wall -O2 main.cpp
-Oオプションを省略すると、最適化を行わないことを意味する-O0がデフォルトとして使用されます(-Oを指定しない場合、-O1に解決されます)。
あるいは、 O
グループの最適化フラグ(またはより多くの実験的最適化)を直接使用してください。次の例は、 -O2
最適化レベルと-O3
最適化レベルの1つのフラグで構築されてい-O3
。
g++ -o app -Wall -O2 -ftree-partial-pre main.cpp
プラットフォーム固有の最適化された実行可能ファイルを生成するには(同じアーキテクチャーのマシン上での実動で使用するため)、次のようにします。
g++ -o app -Wall -O2 -march=native main.cpp
いずれの場合も、Windowsでは.\app.exe
./app
、Linux、Mac OSでは./app
で実行できるバイナリファイルが生成されます。
-o
フラグもスキップできます。この場合、GCCはデフォルトの出力実行可能ファイルa.exe
をWindows上に作成し、 a.out
をUNIX系のシステム上に作成します。ファイルをリンクせずにコンパイルするには、 -c
オプションを使用します。
g++ -o file.o -Wall -c file.cpp
これにより、後に他のファイルとリンクしてバイナリを生成することができるfile.o
という名前のオブジェクトファイルが生成されます。
g++ -o app file.o otherfile.o
最適化オプションの詳細については、 gcc.gnu.orgを参照してください 。特に重要なのは、 -Og
(デバッグ経験を重視した最適化 - 標準の編集 - コンパイル - デバッグサイクルに推奨)と-Ofast
(すべての最適化、厳密な標準準拠を無視したものを含む)です。
-Wall
フラグは、多くの一般的なエラーの警告を有効にします。常に使用する必要があります。コードの品質を向上させるために、多くの場合、使用することも奨励されている-Wextra
によって自動的に有効になっていないと、他の警告フラグ-Wall
と-Wextra
。
コードが特定のC ++標準を予期している場合は、 -std=
フラグを含めることで、使用する標準を指定します。サポートされている値は、ISO C ++標準の各バージョンの最終年度に対応しています。 GCC 6.1.0以降、 std=
フラグの有効な値は、 c++98
/ c++03
、 c++11
、 c++14
、およびc++17
/ c++1z
です。スラッシュで区切られた値は等価です。
g++ -std=c++11 <file>
GCCには、 -std=
フラグで指定された標準と競合すると無効になるコンパイラ固有の拡張機能がいくつか含まれています。すべての拡張機能を有効にしてコンパイルするには、値gnu++XX
どこを用いてもよいXX
で使用される年のいずれかであるc++
上記の値を。
指定されていない場合、デフォルトの標準が使用されます。バージョン6.1.0より前のバージョンのGCCでは、デフォルトは-std=gnu++03
です。 GCC 6.1.0以降では、デフォルトは-std=gnu++14
です。
GCCのバグのために、 std::thread
やstd::wait_for
など、C ++ 11で導入されたC ++標準のスレッド機能をサポートするために、GCCのコンパイルとリンク時に-pthread
フラグが必要であることに注意してください。スレッディング機能を使用しているときに省略すると、 警告は表示されず 、一部のプラットフォームでは無効な結果になることがあります。
ライブラリとのリンク:
ライブラリ名を渡すには、 -l
オプションを使用します。
g++ main.cpp -lpcre2-8
#pcre2-8 is the PCRE2 library for 8bit code units (UTF-8)
ライブラリが標準ライブラリパスにない場合は、 -L
オプションを付けてパスを追加します。
g++ main.cpp -L/my/custom/path/ -lmylib
複数のライブラリをリンクすることができます:
g++ main.cpp -lmylib1 -lmylib2 -lmylib3
1つのライブラリが別のライブラリに依存する場合は、独立ライブラリの前に依存ライブラリを配置します。
g++ main.cpp -lchild-lib -lbase-lib
またはリンカーを介して、発注自体を決定させる--start-group
と--end-group
(注:これは大幅なパフォーマンスコストがあります):
g++ main.cpp -Wl,--start-group -lbase-lib -lchild-lib -Wl,--end-group
Visual C ++でのコンパイル(コマンドライン)
GCCやClangからVisual Studioに来るプログラマ、あるいは一般的なコマンドラインの方が快適なプログラマにとっては、Visual C ++コンパイラはコマンドラインからもIDEでも使用できます。
Visual Studioでコマンドラインからコードをコンパイルする場合は、まずコマンドライン環境を設定する必要があります。これは、 Visual Studio Command Prompt
/ Developer Command Prompt
/ x86 Native Tools Command Prompt
/ x64 Native Tools Command Prompt
または (Visual Studioのバージョンで提供される) 同様のx64 Native Tools Command Prompt
開くか、コマンドプロンプトでVC
コンパイラのインストールディレクトリ(通常のサブディレクトリ\Program Files (x86)\Microsoft Visual Studio x\VC
、 x
のようなバージョン番号(ある10.0
2010年、または14.0
2015年)とランニングVCVARSALL
でバッチファイルをコマンドラインパラメータはここで指定します 。
Visual Studioでは、GCCとは異なり、コンパイラ( cl.exe
)を介してリンカ( link.exe
)のフロントエンドを提供するのではなく、コンパイラが終了時に呼び出す別のプログラムとしてリンカを提供しています。 cl.exe
とlink.exe
は、別々のファイルとオプションで別々に使用できます。また、 cl
は、両方のタスクが一緒に実行された場合にlink
するファイルとオプションを渡すよう指示できます。 cl
指定されたlink
オプションはlink
オプションに変換され、 cl
処理されないファイルはlink
直接渡されます。これは主にVisual Studioのコマンドラインでコンパイルするための簡単なガイドですので、 link
引数は現時点では説明されません。リストが必要な場合は、 こちらをご覧ください 。
cl
への引数は大文字と小文字を区別し、 link
する引数はそうではないことに注意してください。
[絶対パス名を指定する場合は、Windowsシェルの "カレントディレクトリ"変数%cd%
使用することをお勧めします。この変数に慣れていない人は、現在の作業ディレクトリに展開されます。コマンドラインからは、 cl
を実行したときのディレクトリになり、デフォルトでコマンドプロンプトで指定されます(たとえば、コマンドプロンプトがC:\src>
場合、 %cd%
はC:\src\
)。]
現在のフォルダにmain.cpp
という名前の単一のソースファイルがあると仮定すると、最適化されていない実行可能ファイルをコンパイルしてリンクするコマンド(最初の開発とデバッグに便利です)は次のいずれかです:
cl main.cpp
// Generates object file "main.obj".
// Performs linking with "main.obj".
// Generates executable "main.exe".
cl /Od main.cpp
// Same as above.
// "/Od" is the "Optimisation: disabled" option, and is the default when no /O is specified.
追加のソースファイル "niam.cpp"が同じディレクトリにあると仮定して、以下を使用してください:
cl main.cpp niam.cpp
// Generates object files "main.obj" and "niam.obj".
// Performs linking with "main.obj" and "niam.obj".
// Generates executable "main.exe".
また、次のようにワイルドカードを使用することもできます。
cl main.cpp src\*.cpp
// Generates object file "main.obj", plus one object file for each ".cpp" file in folder
// "%cd%\src".
// Performs linking with "main.obj", and every additional object file generated.
// All object files will be in the current folder.
// Generates executable "main.exe".
実行可能ファイルの名前を変更または再配置するには、次のいずれかを使用します。
cl /o name main.cpp
// Generates executable named "name.exe".
cl /o folder\ main.cpp
// Generates executable named "main.exe", in folder "%cd%\folder".
cl /o folder\name main.cpp
// Generates executable named "name.exe", in folder "%cd%\folder".
cl /Fename main.cpp
// Same as "/o name".
cl /Fefolder\ main.cpp
// Same as "/o folder\".
cl /Fefolder\name main.cpp
// Same as "/o folder\name".
/o
と/Fe
ともに、必要に応じて適切な拡張子(通常は.exe
または.dll
)を "name" o-param
に追加して、 /OUT:o-param
としてlink
するパラメータ( o-param
と呼ぶ)を渡します。 /o
と/Fe
はどちらも機能が同じですが、Visual Studioでは後者が優先されます。 /o
は廃止予定とマークされており、主にGCCやClangに詳しいプログラマー向けに提供されているようです。
/o
と指定したフォルダおよび/または名前の間のスペースはオプションですが、 /Fe
と指定したフォルダおよび/または名前の間にはスペースを入れることはできません 。
同様に、最適化された実行可能ファイルを生成するには、次のようにします。
cl /O1 main.cpp
// Optimise for executable size. Produces small programs, at the possible expense of slower
// execution.
cl /O2 main.cpp
// Optimise for execution speed. Produces fast programs, at the possible expense of larger
// file size.
cl /GL main.cpp other.cpp
// Generates special object files used for whole-program optimisation, which allows CL to
// take every module (translation unit) into consideration during optimisation.
// Passes the option "/LTCG" (Link-Time Code Generation) to LINK, telling it to call CL during
// the linking phase to perform additional optimisations. If linking is not performed at this
// time, the generated object files should be linked with "/LTCG".
// Can be used with other CL optimisation options.
最後に、プラットフォーム固有の最適化された実行可能ファイル(指定されたアーキテクチャを持つマシン上のVCVARSALL
使用するため)をVCVARSALL
するには、ターゲットプラットフォーム用の適切なコマンドプロンプトまたはVCVARSALL
パラメータを選択します。 link
は、オブジェクトファイルから目的のプラットフォームを検出する必要があります。そうでない場合は、 /MACHINE
オプションを使用してターゲットプラットフォームを明示的に指定します。
// If compiling for x64, and LINK doesn't automatically detect target platform:
cl main.cpp /link /machine:X64
上記のいずれの場合も、 /o
または/Fe
で指定された名前の実行可能ファイルが生成されます。どちらも指定されていない場合は、コンパイラに指定された最初のソースファイルまたはオブジェクトファイルと同じ名前が付けられます。
cl a.cpp b.cpp c.cpp
// Generates "a.exe".
cl d.obj a.cpp q.cpp
// Generates "d.exe".
cl y.lib n.cpp o.obj
// Generates "n.exe".
cl /o yo zp.obj pz.cpp
// Generates "yo.exe".
リンクせずにファイルをコンパイルするには、以下を使用します。
cl /c main.cpp
// Generates object file "main.obj".
これは、 link
を呼び出さずに終了するようにcl
に指示し、オブジェクトファイルを生成します。このファイルは後に他のファイルとリンクしてバイナリを生成することができます。
cl main.obj niam.cpp
// Generates object file "niam.obj".
// Performs linking with "main.obj" and "niam.obj".
// Generates executable "main.exe".
link main.obj niam.obj
// Performs linking with "main.obj" and "niam.obj".
// Generates executable "main.exe".
他にも貴重なコマンドラインパラメータがあります。これはユーザが知っておくと非常に便利です:
cl /EHsc main.cpp
// "/EHsc" specifies that only standard C++ ("synchronous") exceptions will be caught,
// and `extern "C"` functions will not throw exceptions.
// This is recommended when writing portable, platform-independent code.
cl /clr main.cpp
// "/clr" specifies that the code should be compiled to use the common language runtime,
// the .NET Framework's virtual machine.
// Enables the use of Microsoft's C++/CLI language in addition to standard ("native") C++,
// and creates an executable that requires .NET to run.
cl /Za main.cpp
// "/Za" specifies that Microsoft extensions should be disabled, and code should be
// compiled strictly according to ISO C++ specifications.
// This is recommended for guaranteeing portability.
cl /Zi main.cpp
// "/Zi" generates a program database (PDB) file for use when debugging a program, without
// affecting optimisation specifications, and passes the option "/DEBUG" to LINK.
cl /LD dll.cpp
// "/LD" tells CL to configure LINK to generate a DLL instead of an executable.
// LINK will output a DLL, in addition to an LIB and EXP file for use when linking.
// To use the DLL in other programs, pass its associated LIB to CL or LINK when compiling those
// programs.
cl main.cpp /link /LINKER_OPTION
// "/link" passes everything following it directly to LINK, without parsing it in any way.
// Replace "/LINKER_OPTION" with any desired LINK option(s).
* nixシステムやGCC / Clangに精通している人なら、 cl
、 link
、およびその他のVisual Studioコマンドラインツールは、スラッシュ( /c
など)の代わりにハイフン( -c
など)で指定したパラメータを受け入れることができます。さらに、Windowsではスラッシュまたはバックスラッシュが有効なパス区切り文字として認識されるため、* nix形式のパスも使用できます。これにより、単純なコンパイラコマンドラインをg++
やclang++
からcl
に簡単に変換することができます。
g++ -o app src/main.cpp
cl -o app src/main.cpp
もちろん、より複雑なg++
やclang++
オプションを使用するコマンドラインを移植する場合は、該当するコンパイラのドキュメントやリソースサイトで同等のコマンドを検索する必要がありますが、これにより、新しいコンパイラ。
コードに特定の言語機能が必要な場合は、MSVCの特定のリリースが必要でした。 Visual C ++ 2015 Update 3では 、 /std
フラグを使用してコンパイルする標準のバージョンを選択することができます。可能な値は、 /std:c++14
および/std:c++latest
( /std:c++17
がまもなく続きます)です。
注:このコンパイラの旧バージョンでは、特定の機能フラグが使用可能でしたが、これは主に新機能のプレビューに使用されていました。
Visual Studio(グラフィカルインターフェイス)でコンパイルする - Hello World
- Visual Studio Community 2015をダウンロードしてインストールする
- Visual Studioコミュニティを開く
- 「ファイル」 - >「新規」 - >「プロジェクト」をクリックします。
- [テンプレート] - > [Visual C ++] - > [Win32コンソールアプリケーション]をクリックし、 MyFirstProgramという名前を付けます。
- OKをクリックします。
- 次のウィンドウで[次へ]をクリックします。
- [
Empty project
]チェックボックスをオンにし、[完了]をクリックします。 - ソースファイルを右クリック - >追加 - >新しい項目:
- C ++ファイルを選択し、main.cppファイルに名前を付けて、「追加」をクリックします。 10:次のコードをコピーして新しいファイルmain.cppに貼り付けます。
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
return 0;
}
- デバッグ - >デバッグなしで開始(またはctrl + F5を押す)をクリックします。
Clangとのコンパイル
ClangのフロントエンドはGCCと互換性があるように設計されているので、 GCCを使ってコンパイルできるプログラムのほとんどは、ビルドスクリプトでg++
をclang++
でスワップするとコンパイルされます。 -std=version
が指定されていない場合、gnu11が使用されます。
MSVCに慣れているWindowsユーザーは、 cl.exe
をclang-cl.exe
と入れ替えることができます。デフォルトでは、clangはインストールされているMSVCの最高バージョンとの互換性を得ようとします。
Visual Studioを使用してコンパイルする場合は、プロジェクトプロパティのPlatform toolset
を変更してclang-clを使用できます。
どちらの場合も、clangはフロントエンド経由でのみ互換性がありますが、バイナリ互換オブジェクトファイルも生成しようとします。 clang-clのユーザーは、MSVCとの互換性がまだ完全ではないことに注意する必要があります。
clangやclang-clを使うには、特定のLinuxディストリビューションやIDEにバンドルされているもの(MacのXCodeなど)でデフォルトインストールを使うことができます。このコンパイラの他のバージョンまたはこれがインストールされていないプラットフォームでは、 公式のダウンロードページからダウンロードできます 。
CMakeを使ってコードをビルドする場合は、通常、 CC
やCXX
環境変数を次のように設定してコンパイラを切り替えることができます:
mkdir build
cd build
CC=clang CXX=clang++ cmake ..
cmake --build .
Cmakeの紹介も参照してください。
オンラインコンパイラ
さまざまなWebサイトがC ++コンパイラへのオンラインアクセスを提供しています。オンラインコンパイラの機能セットはサイトによって大きく異なりますが、通常は次のことが可能です。
- ブラウザのコードをWebフォームに貼り付けます。
- いくつかのコンパイラオプションを選択し、コードをコンパイルします。
- コンパイラおよび/またはプログラム出力を収集する。
コンパイラを実行してサーバー側で任意のコードを実行できるようにするオンラインコンパイラのWebサイトの動作は、通常は非常に制限されていますが、通常はリモートの任意のコードの実行は脆弱性とみなされます。
オンラインコンパイラは、次の目的に役立ちます。
- C ++コンパイラがないマシン(スマートフォン、タブレットなど)から小さなコードスニペットを実行します。
- 異なるコンパイラでコードをコンパイルし、コンパイルしたコンパイラに関係なく同じ方法でコードを実行するようにしてください。
- C ++の基礎を学び、教える。
- 最新のC ++コンパイラがローカルマシンで利用できない場合、最新のC ++機能(近い将来C ++ 14とC ++ 17)を学んでください。
- 他のコンパイラの大きなセットと比較してコンパイラにバグを発見します。コンパイラのバグが将来のバージョンで修正されたかどうかを確認してください。これはあなたのマシンでは利用できません。
- オンラインジャッジの問題を解決する。
オンラインコンパイラが使用されるべきでないもの:
- C ++を使用してフル機能のアプリケーション(小さなアプリケーションでも)を開発する。通常、オンラインコンパイラはサードパーティのライブラリとのリンクやビルドアーティファクトのダウンロードを許可していません。
- 集中的な計算を実行します。サーバー側のコンピューティングリソースは限られているため、ユーザー提供のプログラムは数秒後に強制終了されます。許可された実行時間は通常、テストや学習に十分です。
- コンパイラサーバー自体またはネット上のサードパーティホストを攻撃する。
例:
免責事項:文書作成者は以下のリソースには関係しません。ウェブサイトはアルファベット順に表示されます。
- http://codepad.org/コード共有によるオンラインコンパイラ。ソースコードの警告またはエラーでコンパイルした後にコードを編集することはあまりうまく機能しません。
- http://coliru.stacked-crooked.com/コマンドラインを指定するオンラインコンパイラ。使用のためにGCCとClangコンパイラの両方を提供します。
- http://cpp.sh/ - C ++ 14をサポートするオンラインコンパイラ。コンパイラのコマンドラインを編集することはできませんが、いくつかのオプションはGUIコントロールで利用できます。
- https://gcc.godbolt.org/ - コンパイラのバージョン、アーキテクチャ、および逆アセンブリ出力の幅広いリストを提供します。あなたのコードが異なるコンパイラによってコンパイルされているものを検査する必要があるときに非常に便利です。 ARM、ARMv8(ARM64として)、Atmel AVR、MIPS、MIPS64、MSP430、PowerPCで利用可能なこれらのコンパイラは、GCC、Clang、MSVC(
CL
)、Intelコンパイラ(icc
)、ELLCC、Zapccがあります。 、x86、およびx64アーキテクチャーです。コンパイラのコマンドライン引数を編集することができます。 - https://ideone.com/ - コードスニペットの動作を説明するために、ネット上で広く使用されています。使用のためにGCCとClangの両方を提供しますが、コンパイラのコマンドラインを編集することはできません。
- http://melpon.org/wandbox - 多数のClangとGNU / GCCコンパイラのバージョンをサポートしています。
- http://onlinegdb.com/ - エディタ、コンパイラ(gcc)、およびデバッガ(gdb)を含む極小のIDEです。
- http://rextester.com/ - Boostライブラリを利用できるように、CとC ++の両方のためのClang、GCC、およびVisual Studioコンパイラ(他の言語のコンパイラと一緒に)を提供します。
- http://tutorialspoint.com/compile_cpp11_online.php - GCCを備えたフル機能のUNIXシェルと、使いやすいプロジェクトエクスプローラです。
- http://webcompiler.cloudapp.net/ - RiSE4funの一部としてMicrosoftが提供するオンラインVisual Studio 2015コンパイラ。
C ++コンパイルプロセス
C ++プログラムを開発するときは、プログラムをコンパイルしてから実行してください。コンパイルとは、C、C ++などの人間が読める言語で書かれたプログラムを、中央処理装置が直接理解できるマシンコードに変換するプロセスです。たとえば、prog.cppという名前のC ++ソースコードファイルがあり、コンパイルコマンドを実行すると、
g++ -Wall -ansi -o prog prog.cpp
ソースファイルから実行可能ファイルを作成するには、主に4つの段階があります。
C ++プリプロセッサは、C ++ソースコードファイルを取り、ヘッダ(#include)、マクロ(#define)、その他のプリプロセッサディレクティブを処理します。
C ++プリプロセッサによって生成された拡張C ++ソースコードファイルは、プラットフォームのアセンブリ言語にコンパイルされます。
コンパイラによって生成されたアセンブラコードは、プラットフォーム用のオブジェクトコードにアセンブルされます。
アセンブラで生成されたオブジェクトコードファイルはリンクされています
ライブラリまたは実行可能ファイルを生成するために使用されるライブラリ関数のオブジェクトコードファイルを使用します。
前処理
プリプロセッサは#includeや#defineのようなプリプロセッサ指令を扱います。これはC ++の構文には無関心です。そのため、注意して使用する必要があります。
#includeディレクティブをそれぞれのファイルの内容(通常は宣言のみ)に置き換え、マクロ(#define)を置き換え、#ifに応じてテキストの異なる部分を選択することで、一度に1つのC ++ソースファイルで動作します。 #ifdefおよび#ifndefディレクティブ。
プリプロセッサは、前処理トークンのストリーム上で動作します。マクロ置換は、トークンを他のトークンに置き換えることで定義されます(演算子##は、2つのトークンを合併させることができます)。
この後、プリプロセッサは、上記の変換結果のトークンのストリームである単一の出力を生成します。また、各行がどこから来たのかをコンパイラに伝える特別なマーカーを追加して、それらを使って分かりやすいエラーメッセージを生成することができます。
#ifと#errorディレクティブを賢明に使用して、この段階でエラーを生成することができます。
以下のコンパイラフラグを使用することで、前処理段階でプロセスを停止することができます。
g++ -E prog.cpp
編集
コンパイル・ステップは、プリプロセッサの各出力に対して実行されます。コンパイラは純粋なC ++ソースコードを解析し(プリプロセッサディレクティブなしで)、アセンブリコードに変換します。次に、そのコードを機械コードにアセンブルして、実際のバイナリファイルを何らかの形式(ELF、COFF、a.out、...)で生成する、基盤となるバックエンド(ツールチェーンのアセンブラ)を呼び出します。このオブジェクトファイルには、入力に定義されているシンボルのコンパイル済みコード(バイナリ形式)が格納されています。オブジェクトファイル内のシンボルは名前で参照されます。
オブジェクトファイルは、定義されていないシンボルを参照できます。これは、宣言を使用している場合で、宣言を定義していない場合です。コンパイラはこれに気をつけず、ソースコードが整形式である限り、オブジェクトファイルをうまく生成します。
コンパイラは通常、この時点でコンパイルを停止します。これにより、各ソースコードファイルを個別にコンパイルできるため、非常に便利です。これが提供する利点は、1つのファイルのみを変更した場合、すべてを再コンパイルする必要がないことです。
生成されたオブジェクトファイルは、後で再利用するために、静的ライブラリと呼ばれる特別なアーカイブに置くことができます。
この段階では、構文エラーや失敗したオーバーロード解決エラーなどの「通常の」コンパイラエラーが報告されます。
コンパイル・ステップの後でプロセスを停止するために、-Sオプションを使用できます。
g++ -Wall -ansi -S prog.cpp
組み立て
アセンブラはオブジェクトコードを作成します。 UNIXシステムでは、オブジェクトコードファイルを示すために、接尾辞が.o(MSDOSでは.OBJ)のファイルが表示されることがあります。このフェーズでは、アセンブラはこれらのオブジェクトファイルをアセンブリコードからマシンレベルの命令に変換し、作成されたファイルは再配置可能なオブジェクトコードです。したがって、コンパイルフェーズではリロケータブルオブジェクトプログラムが生成され、このプログラムは別の場所で使用して再度コンパイルする必要はありません。
アセンブリステップ後にプロセスを停止するには、-cオプションを使用できます。
g++ -Wall -ansi -c prog.cpp
リンクする
リンカは、アセンブラが生成したオブジェクトファイルから最終的なコンパイル出力を生成するものです。この出力は、共有(または動的)ライブラリ(名前が似ていても、前述の静的ライブラリとほとんど同じではありません)または実行可能ファイルのいずれかです。
未定義のシンボルへの参照を正しいアドレスに置き換えることによって、すべてのオブジェクトファイルをリンクします。これらのシンボルのそれぞれは、他のオブジェクトファイルまたはライブラリで定義することができます。それらが標準ライブラリ以外のライブラリに定義されている場合、それらについてリンカに伝える必要があります。
この段階で最も一般的なエラーは定義が不足しているか、定義が重複しています。前者は、定義が存在しない(すなわち、書き込まれていない)か、またはそれらが存在するオブジェクトファイルまたはライブラリがリンカーに与えられていないことを意味します。後者は明らかです。同じシンボルが2つの異なるオブジェクトファイルまたはライブラリで定義されています。
Code :: Blocks(Graphical interface)でコンパイルする
Code :: Blocksをダウンロードしてインストールしてください 。 Windowsの場合は、名前に
mingw
が含まれているファイルを選択するように注意してください。他のファイルはコンパイラをインストールしません。Code :: Blocksを開き、 "Create a new project"をクリックしてください:
「コンソールアプリケーション」を選択し、「実行」をクリックします。
"次へ"をクリックして "次へ"をクリックし、プロジェクトの名前を選択して保存するフォルダを選択し、 "次へ"をクリックして "完了"をクリックします。
これでコードを編集してコンパイルできます。 「Hello world!」を出力するデフォルトコード。コンソールには既にそこにあります。プログラムをコンパイルおよび/または実行するには、ツールバーの3つのコンパイル/実行ボタンの1つを押します。
実行せずにコンパイルするには、 、再度コンパイルせずに実行するには、 コンパイルしてから実行するには、 。
デフォルトの "Hello world!"をコンパイルして実行します。コードは次の結果を返します。