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 のスロークエリ分析とスロークエリログの開き方の詳細説明

推薦する

Reactにおけるフックの一般的な使用法

目次1. フックとは何ですか? 2. フックはなぜ現れるのでしょうか? 3. よく使われるフックは何...

doctype のマークアップ検証

しかし最近、この方法を使用すると問題が発生することがわかりました。コードを参照してください。コードを...

MySQL シリーズ 3 基礎

目次チュートリアルシリーズ1. MySQL の紹介2. MySQLの開発履歴3. MariaDBの基...

JSメモリ空間の詳細な説明

目次概要1. スタックとヒープ2. 変数オブジェクトと基本データ型3. 参照データ型とヒープメモリメ...

Vue のデータ応答性に関する詳細な理解

目次1. ES 構文のゲッターとセッター2. ES構文でのdefineProperty 3. Vue...

ウェブサイトのユーザーエクスペリエンスデザイン(UE)

Google Reader で、JunChen が書いた「フロー理論と設計」というタイトルの投稿を見...

Linux CentOS 6.5 ifconfig が IP を照会できない問題の解決方法

最近、何人かの友人から、仮想マシンに CentOS をインストールした後、ifconfig コマンド...

サブメニューをクリックする効果を実現するJavaScript

この記事では、クリック時にサブメニューを表示するためのJavaScriptの具体的なコードを参考まで...

Nginx の構成と HTTP 実装コード分析との互換性

OpenSSL を使用して SSL キーと CSR ファイルを生成するHTTPS を設定するには、秘...

dockercompose を使用して springboot-mysql-nginx アプリケーションをビルドする

前回の記事では、Docker を使用して、コンパイルされた jar パッケージをイメージに組み込む ...

アニメーションの再生と一時停止を制御するための CSS のヒント (非常に実用的)

今日は、CSS を使用してアニメーションの再生と一時停止を制御する非常に簡単なトリックを紹介します。...

一般的な Linux ディストリビューションのミラーソース構成の概要

最近 Linux を研究していて、いくつかの Linux ディストリビューションを試してみましたが、...

RoughViz を使用して Vue.js でスケッチされたチャートを視覚化する方法

導入チャートは、データ セットを読みやすくし、その各部分を区別しやすくするために使用されるデータのグ...

シンプルなカルーセル チャートを実装するための JavaScript の最も完全なコード分析 (ES5)

この記事では、シンプルなカルーセル効果を実現するためのJavaScriptの具体的なコードを参考まで...

CentOS7 構成 Alibaba Cloud yum ソースメソッドコード

Centos yumフォルダを開くコマンドcd /etc/yum.repos.d/を入力します。 w...