C++
 Computer >> コンピューター >  >> プログラミング >> C++

GCCを使ってC++プログラムをコンパイルする方法と-lstdc++オプションの重要性

この記事では、GCC(GNU Compiler Collection)を使用してC++プログラムをコンパイルする方法を解説します。まず、次のサンプルプログラムをコンパイルすることを想定してみましょう。

サンプルプログラム

#include<iostream>
using namespace std;
main() {
    cout << "Hello World. This is C++ program" << endl;
}

C言語の場合のコンパイル方法

もし上記がC言語のプログラムであれば、GCCを使って次のように簡単にコンパイルできます。

gcc test.c

C++ファイルをgccコマンドでコンパイルするとどうなるか

しかし、ここにC++のファイル名を指定すると、エラーが発生する可能性があります。

gcc test.cpp

出力結果(エラー例)

/tmp/ccf1KGDi.o: In function `main':
1325.test.cpp:(.text+0xe): undefined reference to `std::cout'
1325.test.cpp:(.text+0x13): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& 
std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
1325.test.cpp:(.text+0x1d): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, 
std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
1325.test.cpp:(.text+0x28): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/tmp/ccf1KGDi.o: In function `__static_initialization_and_destruction_0(int, int)':
1325.test.cpp:(.text+0x58): undefined reference to `std::ios_base::Init::Init()'
1325.test.cpp:(.text+0x6d): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
$

エラーの原因は「リンクエラー」

このエラーはコンパイルエラーではなく、リンクエラーです。C++の標準ライブラリ(libstdc++)がリンクされていないため、std::coutなどのシンボルが未定義になっています。

正しいリンカ設定を行うには、-lstdc++オプションを付けてコンパイルします。

gcc test.cpp -lstdc++

実行結果

$ ./a.out
Hello World. This is C++ program
$

補足:より推奨される方法

-lstdc++オプションでも問題なくコンパイルできますが、実際の開発ではg++コマンドを使うのが一般的です。g++はC++専用のフロントエンドであり、標準ライブラリのリンクも自動的に行ってくれます。

g++ test.cpp

また、最新のGCCではmain()関数に戻り値の型を明示しないと警告やエラーになる場合があるため、int main()と書き、最後にreturn 0;を追加しておくとより安全です。

  1. 半径Rの円形の池の円周を求めるC++プログラム

    ある数値 R が与えられ、これは円形の池の半径を表しているとします。このとき、池の円周(外周)の長さを求める必要があります。たとえば、入力が R = 73 の場合、出力は 458.67252742410977361942 となります。解き方の手順この問題を解くには、以下の手順に従います。円周は「直径 × 円周率」で表されるため、半径 r を使うと 2 × r × π で計算できます。ここでは、逆余弦関数 acos(-1) の戻り値が円周率 π に等しいという性質を利用します。res := r * 2 * cos-inverse (-1) return resC++での実装例理解を深めるために、

  2. C++で特定の条件を満たすグラフを構築するプログラム

    2つの整数 N と K が与えられます。ここで、N 個の頂点を持つ無向グラフについて考えます。このグラフは以下の条件をすべて満たす必要があります。グラフは単純グラフであり、かつ連結である頂点には 1 から N までの番号が付けられているグラフの辺の数を M とすると、辺には 1 から M までの番号が付けられており、各辺の長さは 1 です。辺 i は頂点 U[i] と頂点 V[i] を結びますi < j を満たす頂点のペア (i, j) のうち、2 頂点間の最短距離がちょうど 2 になるものが正確に K 組存在するこのようなグラフが存在する場合はそれを構築して出力し、存在しない場合は -