検索
ホームページ運用・保守Linuxの運用と保守Linux で g++ を使用して C++ をコンパイルする方法

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

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

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


/* helloworld.cpp */
#include <iostream>
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 <iostream>
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 <iostream>
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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Linuxのメンテナンスモードの理解:必需品Linuxのメンテナンスモードの理解:必需品Apr 14, 2025 am 12:04 AM

Linuxメンテナンスモードは、起動時にinit =/bin/bashまたは単一パラメーターを追加することにより入力されます。 1.メンテナンスモードの入力:GRUBメニューを編集し、起動パラメーターを追加します。 2。ファイルシステムを読み取りおよび書き込みモードに再マウントします:Mount-Oremount、RW/。 3。ファイルシステムの修復:FSCK/dev/sda1などのFSCKコマンドを使用します。 4.データをバックアップし、データの損失を避けるために慎重に動作します。

DebianがHadoopデータ処理速度を改善する方法DebianがHadoopデータ処理速度を改善する方法Apr 13, 2025 am 11:54 AM

この記事では、DebianシステムのHadoopデータ処理効率を改善する方法について説明します。最適化戦略では、ハードウェアのアップグレード、オペレーティングシステムパラメーターの調整、Hadoop構成の変更、および効率的なアルゴリズムとツールの使用をカバーしています。 1.ハードウェアリソースの強化により、すべてのノードが一貫したハードウェア構成、特にCPU、メモリ、ネットワーク機器のパフォーマンスに注意を払うことが保証されます。高性能ハードウェアコンポーネントを選択することは、全体的な処理速度を改善するために不可欠です。 2。オペレーティングシステムチューニングファイル記述子とネットワーク接続:/etc/security/limits.confファイルを変更して、システムによって同時に開くことができるファイル記述子とネットワーク接続の上限を増やします。 JVMパラメーター調整:Hadoop-env.shファイルで調整します

Debian syslogを学ぶ方法Debian syslogを学ぶ方法Apr 13, 2025 am 11:51 AM

このガイドでは、Debian SystemsでSyslogの使用方法を学ぶように導きます。 Syslogは、ロギングシステムとアプリケーションログメッセージのLinuxシステムの重要なサービスです。管理者がシステムアクティビティを監視および分析して、問題を迅速に特定および解決するのに役立ちます。 1. syslogの基本的な知識Syslogのコア関数には以下が含まれます。複数のログ出力形式とターゲットの場所(ファイルやネットワークなど)をサポートします。リアルタイムのログ表示およびフィルタリング機能を提供します。 2。syslog(rsyslogを使用)をインストールして構成するDebianシステムは、デフォルトでrsyslogを使用します。次のコマンドでインストールできます:sudoaptupdatesud

DebianでHadoopバージョンを選択する方法DebianでHadoopバージョンを選択する方法Apr 13, 2025 am 11:48 AM

Debianシステムに適したHadoopバージョンを選択する場合、次の重要な要因を考慮する必要があります。1。安定性と長期的なサポート:安定性とセキュリティを追求するユーザーにとって、Debian11(Bullseye)などのDebianの安定したバージョンを選択することをお勧めします。このバージョンは完全にテストされており、最大5年のサポートサイクルがあり、システムの安定した動作を確保できます。 2。パッケージの更新速度:最新のHadoop機能と機能を使用する必要がある場合は、DebianのUnstableバージョン(SID)を検討できます。ただし、不安定なバージョンには互換性の問題と安定性のリスクがあることに注意する必要があります。 3。コミュニティのサポートとリソース:Debianには、豊富なドキュメントを提供できるコミュニティサポートが大きくなり、

debianのtigervnc共有ファイルメソッドdebianのtigervnc共有ファイルメソッドApr 13, 2025 am 11:45 AM

この記事では、Tigervncを使用してDebian Systemsでファイルを共有する方法について説明します。最初にtigervncサーバーをインストールしてから構成する必要があります。 1. TigerVNCサーバーをインストールし、端末を開きます。ソフトウェアパッケージリストの更新リスト:sudoaptupdate tigervnc server:sudoaptinstaltaltigervnc-standalone-servertigervnc-common2。tigervncサーバーを構成するVNCサーバーパスワードを設定します。

Debian Mail Serverファイアウォールの構成のヒントDebian Mail Serverファイアウォールの構成のヒントApr 13, 2025 am 11:42 AM

Debian Mail Serverのファイアウォールの構成は、サーバーのセキュリティを確保するための重要なステップです。以下は、iPtablesやFirewalldの使用を含む、一般的に使用されるファイアウォール構成方法です。 iPtablesを使用してファイアウォールを構成してIPTablesをインストールします(まだインストールされていない場合):sudoapt-getupdatesudoapt-getinstalliptablesview現在のiptablesルール:sudoiptables-l configuration

Debian Mail Server SSL証明書のインストール方法Debian Mail Server SSL証明書のインストール方法Apr 13, 2025 am 11:39 AM

Debian Mail ServerにSSL証明書をインストールする手順は次のとおりです。1。最初にOpenSSL Toolkitをインストールすると、OpenSSLツールキットがシステムに既にインストールされていることを確認してください。インストールされていない場合は、次のコマンドを使用してインストールできます。sudoapt-getUpdatesudoapt-getInstalopenssl2。秘密キーと証明書のリクエストを生成次に、OpenSSLを使用して2048ビットRSA秘密キーと証明書リクエスト(CSR)を生成します:Openss

Debian Mail Server仮想ホスト構成方法Debian Mail Server仮想ホスト構成方法Apr 13, 2025 am 11:36 AM

Debianシステムでのメールサーバーの仮想ホストの構成には、通常、Apache Httpserverではなく、Apache Httpserverではなく、Mail Serverソフトウェア(Postfix、Eximなど)のインストールと構成が含まれます。以下は、メールサーバーの構成のための基本的な手順です仮想ホスト:ポストフィックスメールサーバー更新システムパッケージ:sudoaptupdatesudoaptupgradeポストフィックス:sudoapt

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター