Linux で g++ を使用して C++ をコンパイルする方法

小云云
リリース: 2018-03-26 09:32:14
オリジナル
1920 人が閲覧しました

この記事では主に、Linux 環境で C++ を g++ でコンパイルする方法と、関連するサンプル コードを共有します。興味のある友人はそこから学ぶことができます。皆さんのお役に立てれば幸いです。

単一のソース ファイルで実行可能プログラムが生成されます

以下は、ファイル helloworld.cpp に保存された単純な C++ プログラムのコードです:


/* helloworld.cpp */
#include 
int main(int argc,char *argv[])
{
  std::cout << "hello, world" << std::endl;
  return(0);
}
ログイン後にコピー

このプログラムは、ヘッダー ファイル iostream で定義された cout を使用して、単純な文字列が標準出力に書き込まれます。このコードは、次のコマンドを使用して実行可能ファイルにコンパイルできます:


$ g++ helloworld.cpp
ログイン後にコピー

コンパイラ g++ は、コマンド ラインで指定されたファイルのサフィックス名をチェックすることで、C++ ソース コード ファイルを識別できます。コンパイラーのデフォルトのアクション: ソース・コード・ファイルをコンパイルしてオブジェクト・ファイル (オブジェクト・ファイル) を生成し、オブジェクト・ファイルと libstdc++ ライブラリー内の関数をリンクして、実行可能プログラムを取得します。その後、オブジェクトファイルを削除します。実行可能プログラムのファイル名がコマンド ラインで指定されていないため、コンパイラはデフォルトの a.out を使用します。プログラムは次のように実行できます:


$ ./a.out
hello, world
ログイン後にコピー

より一般的な方法は、-o オプションを使用して実行可能プログラムのファイル名を指定することです。次のコマンドは、helloworld という名前の実行可能ファイルを生成します:


$ g++ helloworld.cpp -o helloworld
ログイン後にコピー

コマンドラインにプログラム名を入力して実行します:


$ ./helloworld
hello, world
ログイン後にコピー

プログラム g++ は、gcc のデフォルト言語を次のように設定する特別なプログラムです。 C++ バージョンでは、リンク時に C 標準ライブラリではなく C++ 標準ライブラリが自動的に使用されます。ソース コードの命名規則に従い、対応するライブラリの名前を指定すると、次の例に示すように、gcc を使用して C++ プログラムをコンパイルおよびリンクできます:


$ gcc helloworld.cpp -lstdc++ -o helloworld
ログイン後にコピー

オプション -l (ell)接頭辞 lib と接尾辞 .a を追加すると、それに続く名前がライブラリ libstdc++.a の名前に変換されます。次に、標準ライブラリ パスでライブラリを検索します。 gcc のコンパイル プロセスと出力ファイルは、g++ とまったく同じです。

ほとんどのシステムでは、GCC のインストール時に c++ と呼ばれるプログラムがインストールされます。インストールされている場合は、次の例に示すように g++ と同等であり、使用法は同じです:


$ c++ helloworld.cpp -o helloworld
ログイン後にコピー

実行可能プログラムを生成する複数のソース ファイル

で複数のソース ファイルが指定されている場合g++ コマンドを使用すると、それらはすべてコンパイルされ、単一の実行可能ファイルにリンクされます。以下は、speak.h という名前のヘッダー ファイルです。これには、関数が 1 つだけ含まれるクラスの定義が含まれています:


/* speak.h */
#include 
class Speak
{
  public:
    void sayHello(const char *);
};
ログイン後にコピー

ファイルの内容は以下のとおりです。sayHello() 関数を含む関数本体:


/* speak.cpp */
#include "speak.h"
void Speak::sayHello(const char *str)
{
  std::cout << "Hello " << str << "\n";
}
ログイン後にコピー

ファイル hellospeak.cpp は、Speak クラスを使用するプログラムです:


/* hellospeak.cpp */
#include "speak.h"
int main(int argc,char *argv[])
{
  Speak speak;
  speak.sayHello("world");
  return(0);
}
ログイン後にコピー

次のコマンドは、上記 2 つのソース コード ファイルをコンパイルし、単一の実行可能プログラムにリンクします:


$ g++ hellospeak.cpp speak.cpp -o hellospeak
ログイン後にコピー

PS: ファイル "speak.h" がコマンドに記載されていない理由について話しましょう (理由は、"#include "speak.h"" が "speak.cpp" に含まれており、その意味はシステム ヘッダー ファイルを検索する前にあるためです)ディレクトリにある場合、ファイル「speak.h」は現在のディレクトリで検索され、「speak.h」はこのディレクトリにあるため、コマンドで指定する必要はありません。

ソースファイルはオブジェクトファイルを生成します

-c オプションは、ソースコードをコンパイルするがリンクは実行しないようにコンパイラーに指示するために使用され、出力結果はオブジェクトファイルになります。デフォルトのファイル名は、サフィックスが .o に変更されることを除いて、ソース ファイル名と同じです。たとえば、次のコマンドはソース ファイル hellospeak.cpp をコンパイルし、オブジェクト ファイル hellospeak.o を生成します。


$ g++ -c hellospeak.cpp
ログイン後にコピー

コマンド g++ は .o ファイルを認識し、入力ファイルとしてリンカーに渡すこともできます。次のコマンドは、ソース ファイルをオブジェクト ファイルにコンパイルし、それらを 1 つの実行可能プログラムにリンクします:


$ g++ -c hellospeak.cpp 
$ g++ -c speak.cpp 
$ g++ hellospeak.o speak.o -o hellospeak
ログイン後にコピー

-o オプションは、実行可能ファイルに名前を付ける以外にも使用できます。これは、コンパイラによって出力される他のファイルに名前を付けるためにも使用されます。例: 次のコマンドは、中間オブジェクト ファイルの名前が異なることを除いて、上記とまったく同じ実行可能ファイルを生成します:


$ g++ -c hellospeak.cpp -o hspk1.o 
$ g++ -c speak.cpp -o hspk2.o 
$ g++ hspk1.o hspk2.o -o hellospeak
ログイン後にコピー

コンパイル前処理

オプション -E により、g++ はソース コードを使用します。 他はありません。アクションは、コンパイル プリプロセッサが処理された後に実行されます。次のコマンドは、ソース コード ファイル helloworld.cpp を前処理し、その結果を標準出力に表示します。


$ g++ -E helloworld.cpp
ログイン後にコピー

この記事で前に示した helloworld.cpp のソース コードには 6 行しかなく、プログラムでは 1 行しか表示されません。 of text 他には何も行いませんが、前処理されたバージョンは 1200 行を超えます。これは主に、ヘッダー ファイル iostream が含まれており、さらに、入力と出力を処理するいくつかのクラスの定義が含まれているためです。

プリプロセスされたファイルの GCC サフィックスは .ii で、-o オプションで生成できます。例:


$ gcc -E helloworld.cpp -o helloworld.ii
ログイン後にコピー

アセンブリ コードを生成します

オプション -S は、コンパイラにプログラムをアセンブリ言語に変換し、アセンブリ言語コードを出力して終了します。次のコマンドは、C++ ソース コード ファイルからアセンブリ言語ファイル helloworld.s を生成します。


$ g++ -S helloworld.cpp
ログイン後にコピー

生成的汇编语言依赖于编译器的目标平台。

创建静态库

静态库是编译器生成的一系列对象文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。库中的成员包括普通函数,类定义,类的对象实例等等。静态库的另一个名字叫归档文件(archive),管理这种归档文件的工具叫 ar 。

在下面的例子中,我们先创建两个对象模块,然后用其生成静态库。

头文件 say.h 包含函数 sayHello() 的原型和类 Say 的定义:


/* say.h */
#include 
void sayhello(void);
class Say {
  private:
    char *string;
  public:
    Say(char *str)
    {
      string = str;
    }
    void sayThis(const char *str)
    {
      std::cout << str << " from a static library\n";
    }
    void sayString(void);
};
ログイン後にコピー

下面是文件 say.cpp 是我们要加入到静态库中的两个对象文件之一的源码。它包含 Say 类中 sayString() 函数的定义体;类 Say 的一个实例 librarysay 的声明也包含在内:


/* say.cpp */
#include "say.h"
void Say::sayString()
{
  std::cout << string << "\n";
}
 
Say librarysay("Library instance of Say");
ログイン後にコピー

源码文件 sayhello.cpp 是我们要加入到静态库中的第二个对象文件的源码。它包含函数 sayhello() 的定义:


/* sayhello.cpp */
#include "say.h"
void sayhello()
{
  std::cout << "hello from a static library\n";
}
ログイン後にコピー

下面的命令序列将源码文件编译成对象文件,命令 ar 将其存进库中:


$ g++ -c sayhello.cpp
$ g++ -c say.cpp
$ ar -r libsay.a sayhello.o say.o
ログイン後にコピー

程序 ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。

下面是主程序 saymain.cpp,它调用库 libsay.a 中的代码:


/* saymain.cpp */
#include "say.h"
int main(int argc,char *argv[])
{
  extern Say librarysay;
  Say localsay = Say("Local instance of Say");
  sayhello();
  librarysay.sayThis("howdy");
  librarysay.sayString();
  localsay.sayString();
  return(0);
}
ログイン後にコピー

该程序可以下面的命令来编译和链接:


$ g++ saymain.cpp libsay.a -o saymain
ログイン後にコピー

程序运行时,产生以下输出:


hello from a static library
howdy from a static library
Library instance of Say
Local instance of Say
ログイン後にコピー

ps:如果一个文件夹下有多个cpp文件需要编译的话,除了采用makefile的方式之外,还可以使用“g++ *.cpp -o hello",“hello为编译生成的可执行文件的名字”,编译时要确保cpp文件和他们各自所引用的头文件在同一个目录下。

相关推荐:

在Linux环境下g++编译GDAL动态库的操作方法

Linux下g++编译以及使用静态库和动态库的方法详解

Linux下如何实现C++操作Mysql数据库的详细介绍


以上がLinux で g++ を使用して C++ をコンパイルする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!