Ubuntu で G++ を使用して CPP ファイルをコンパイルする

Ubuntu で G++ を使用して CPP ファイルをコンパイルする

g++ を使用して初めて cpp ファイルをコンパイルしたとき、未定義の参照エラーが報告されました。カスタム クラス内のすべての関数が見つかりませんでした。情報を検索した後、呼び出されたクラスをリンクする必要があることがわかりました。この記事では、小さな例を使用してコンパイル プロセスについて説明します。 class2 クラスは class1 クラスのメンバー関数を呼び出し、class1 クラスに依存しますが、テスト ファイルは class2 クラスのメンバー関数を呼び出し、class1 クラスに依存します。

//クラス1.h
#ifndef _CLASS1_H
#define _CLASS1_H
クラス クラス1
{
公共:
  整数 i を整数 f に変換します。
};
#終了
//クラス1.cpp
#include<iostream>
#include "class1.h"
名前空間 std を使用します。
int クラス1::f(int i)
{
  (i==0 || i==1)の場合
   1 を返します。
  それ以外
   f(i-1)+f(i-1) を返します。
}
//クラス2.h
#ifndef _CLASS2_H
#define _CLASS2_H
#include "class1.h"
クラス クラス2
{
公共:
  整数 double_f(int i);
};
#終了
//クラス2.cpp
#include<iostream>
#include "class2.h"
名前空間 std を使用します。
int クラス2::double_f(int i)
{
  クラス1c;
  2*cf(i) を返します。
}
//テスト.cpp
#include<iostream>
#include "class2.h"
名前空間 std を使用します。
int メイン()
{
  クラス2 c2;
  cout << c2.double_f(4) <<endl;
  0を返します。
}

まず、class1、class2、テストファイルを.o形式のファイルにコンパイルします。

g++ -c クラス1.cpp
g++ -c クラス2.cpp
g++ -c テスト.cpp

class1とclass2は依存関係にあるため、リンクするには静的ライブラリファイル(.a形式)にパッケージ化する必要があります。

ar -rc クラス1.a クラス1.o
ar -rc クラス2.a クラス2.o

最後のステップは、test.oを実行ファイルにリンクすることです。

g++ -o テスト test.o クラス2.a クラス1.a

実行後、実行可能ファイル test が取得され、./test コマンドを使用して実行できます。リンクするときは、静的リンク ライブラリの順序に注意してください。前後の依存関係の順序を確保する必要があります。たとえば、ここでは、test は class2 に依存し、class2 は class1 に依存しています。リンクするときは、test を calss2 の前に記述し、class2 を class1 の前に記述する必要があります。そうしないと、未定義の参照エラーが発生します。

g++ で複数のファイルを同時にコンパイルする方法

この例では、ファイルは /CPPPFrtory ディレクトリに配置されます。 CD コマンドを使用して、ソース ファイルを含むフォルダーに移動します。
コマンドラインでファイルをリストしてプログラムをコンパイルするには、次のように入力します。

方法 1: g++ Hello.cpp Welcome2.cpp -o Welcome2.out -ansi // 2 つの cpp ソース ファイル、コンパイル後に 1 つの .out ファイルのみが生成されます 方法 2: 「ワイルドカード」を使用してプログラムをコンパイルします。次のように入力します: g++ *.cpp -o Welcome2.out -ansi // * を使用して、ディレクトリ内のコンパイルされるすべてのファイルを置き換えます

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • Ubuntu 16.04.4LTS に mininet をインストールする際に発生する問題と解決策
  • Ubuntu で VIM を C++ 開発エディタとして設定する
  • 開発環境にUbuntu 16をインストール後の初期設定
  • Ubuntu ターミナル マルチウィンドウ 分割画面 ターミネーター
  • Ubuntu 16.04 で PostgreSQL の起動を設定する方法
  • Ubuntu Linux に Git と GitHub をインストールして使用する
  • Ubuntu 16.04はvimとpython3の開発環境を作成します
  • フォアマン Ubuntu16 クイックインストール
  • Ubuntu 18にNvidiaドライバーをインストールして、黒い画面を解決し、解像度の問題を解決する
  • Ubuntu で PHP5 と PHP7 のデュアルバージョンをサポートするシンプルな実装
  • Ubuntu 16.04 にソースコードから Mininet をインストールする

<<:  Node.jsはSTMPプロトコルとEWSプロトコルに基づいてメールを送信します

>>:  MySql のスロークエリ分析とスロークエリログの開き方の詳細説明

ブログ    

推薦する

VirtualBox仮想マシンがNATモードで外部ネットワークに接続できない問題の解決策

背景VirtualBox 仮想マシン (Ubuntu 16.04 システムがロードされている) には...

Vueドロップダウンメニューのコンポーネント開発の詳細説明

この記事の例では、Vueドロップダウンメニューのコンポーネント開発の具体的なコードを参考までに共有し...

Vue のスロットの使用法と適用シナリオの詳細な分析

スロットとは何ですか? Vue では、子コンポーネント タグの中央に何もラップできないことはわかって...

MySQL: MySQL 関数

1. 組み込み関数1. 数学関数ランド()丸め(数値) ceil(数値)階数(数値)ランダム丸め切り...

MySQLクエリが遅い場合の理由と解決策

Python プログラムを書き、Mysql ライブラリを集中的に操作したためです。データ量が多くない...

js キャンバスはランダムなパーティクル効果を実現します

この記事の例では、参考のためにjsキャンバスランダムパーティクルエフェクトの具体的なコードを共有して...

ノードを使用して静的ファイルキャッシュを実装する方法

目次キャッシュキャッシュ位置の分類キャッシュ設定ヘッダーNodeは静的ファイルキャッシュを実装する強...

node.js チュートリアルの Util モジュールの例の詳細な説明

目次タイプ判定から始める厳格な平等エラーファーストと約束デバッグと出力タイプ判定から始めるJavaS...

CSSはフロントエンドの画像変形の問題を完璧に解決します

Toutiao IT School で、CSS がフロントエンドの画像変形の問題を完璧に解決するとい...

MySQL は SQL ステートメントの最新のレコードをクエリします (最適化)

最悪の選択肢は、結果を時間順に並べ替えて最初のものを取ることです。 *から選択 ここで、create...

MySQL 8.0 以降の一般的なコマンドの詳細な説明

リモートアクセスを有効にする次のコマンドを実行して、root ユーザーのリモート アクセス権を有効に...

Win10+Ubuntu 20.04 LTS デュアル システム インストール (UEFI + GPT) (画像とテキスト、複数の画像には注意)

Win10 のインストール (すでにインストールされている場合はスキップしてください) win10...

WeChatアプレットがSMS認証コード送信のカウントダウンを実装

この記事では、WeChatアプレットがSMS認証コードのカウントダウンを送信するための具体的なコード...

HTML 基本要約推奨事項 (テキスト形式)

HTMLテキスト書式タグ 標簽 描述 <b> 定義粗體文本 <em> 呈現...

Navicat を使用して MySQL データベースをエクスポートおよびインポートする方法

MySql は、私たちが頻繁に使用するデータ ソースです。開発者が練習、小規模なプライベート ゲーム...