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

C++の「未定義参照・未解決の外部シンボル」エラーとは?主な原因と対処法

C++でコンパイルやビルドを行う際に発生する「undefined reference(未定義参照)」「unresolved external symbol(未解決の外部シンボル)」というエラーは、その名の通り、宣言されたシンボルに対する定義が見つからないことを意味します。このエラーはさまざまな状況で起こり得ますが、ここでは特によくある3つの典型的なケースを紹介します。

原因1:宣言した名前の定義を忘れている

関数などを宣言したものの、その実体(定義)を書き忘れてしまうケースです。宣言だけ行って呼び出した場合、リンク時にこのエラーが発生します。

#include<iostream>
void foo();
int main() {
    foo(); // 宣言されているが定義されていない
}

原因2:修飾名を使わずに定義している

クラスのメソッドを定義する際に、スコープ解決演算子(::)を使ってクラスと結び付けていないケースです。以下の例では、本来 A::foo と書くべきところをグローバルな foo() として定義しているため、メンバ関数として認識されずエラーになります。

#include<iostream>
class A {
    void foo();
};
void foo() { } // 本来は A::foo と書くべき
int main() {
    A a;
    a.foo(); // 未定義!
}

原因3:依存関係の指定順序が正しくない

リンカは、指定された順序に従ってオブジェクトファイルやライブラリをリンクします。そのため、定義よりも先に関数などを使用するような順序で指定していると、このエラーが発生しやすくなります。リンクの順番を見直し、依存される側が先に来るようにしましょう。

まとめ

このエラーを引き起こす条件をすべて列挙することは困難ですが、Stack Overflowの以下の投稿では、考えられる原因が非常に丁寧にまとめられています。原因特定に悩んだときは、ぜひ参考にしてください。
What is an undefined reference/unresolved external symbol error and how do I fix it?

  1. C++のブールリテラルとは?trueとfalseの基本と使い方を解説

    ブールリテラル(Boolean literals)とは、「真(true)」または「偽(false)」のいずれかの意味を持つリテラルのことです。C++におけるブールリテラルは true と false の2種類のみ存在し、これらは bool 型として扱われます。bool 型の変数には、この2つの値のどちらかを代入できます。条件分岐やループの判定など、プログラムのロジック制御において非常に重要な役割を果たします。ブールリテラルの使用例以下のコードでは、bool 型の変数に true を代入し、if文でその値を判定しています。#include<iostream> using namesp

  2. C++標準ライブラリとは?主要コンポーネントと特徴を徹底解説

    C++標準ライブラリの概要 C++プログラミング言語における標準ライブラリ(C++ Standard Library)とは、コア言語で記述され、C++ ISO標準規格の一部として定義されているクラスや関数のコレクションです。 標準ライブラリを活用することで、開発者は以下のような機能を追加実装の手間なく利用できます。 汎用コンテナと、それらを操作するための関数 関数オブジェクト 汎用的な文字列やストリーム(対話型I/OやファイルI/Oを含む) 一部の言語機能のサポート 数値の平方根を求めるなど、日常的なタスクのための関数 C++標準ライブラリの主な構成要素 1. ストリーム(Streams)