MeWrite Docs

C++: undefined reference to

C++リンク時に関数やシンボルが見つからない場合のエラー

概要

C++のリンク時に、宣言された関数やシンボルの定義が見つからない場合に発生するエラーです。

エラーメッセージ

undefined reference to `functionName()'

または

undefined reference to `ClassName::methodName()'

原因

  1. 関数の定義がない: 宣言のみで実装がない
  2. ライブラリのリンク忘れ: 必要なライブラリを指定していない
  3. オブジェクトファイルの不足: コンパイルしたファイルをリンクしていない
  4. 名前修飾の不一致: C/C++の名前修飾の違い

解決策

1. 関数の定義を確認

1
2
3
4
5
6
7
// header.h
void myFunction();  // 宣言

// source.cpp
void myFunction() {  // 定義が必要
    // 実装
}

2. すべてのソースファイルをコンパイル

1
2
3
4
5
# 悪い例:main.cppのみコンパイル
g++ main.cpp -o program

# 良い例:すべてのソースファイルをコンパイル
g++ main.cpp utils.cpp helper.cpp -o program

3. ライブラリをリンク

1
2
3
4
5
6
7
8
# 数学ライブラリ(-lm)
g++ main.cpp -lm -o program

# pthreadライブラリ
g++ main.cpp -lpthread -o program

# 複数ライブラリ
g++ main.cpp -lssl -lcrypto -o program

4. extern “C” を使用(C関数呼び出し時)

1
2
3
4
// C++からC関数を呼び出す場合
extern "C" {
    void c_function();
}

5. テンプレートの実装をヘッダに

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 悪い例:テンプレートの実装を.cppに分離
// header.h
template<typename T>
T add(T a, T b);

// source.cpp
template<typename T>
T add(T a, T b) { return a + b; }  // リンクエラー

// 良い例:ヘッダに実装を含める
// header.h
template<typename T>
T add(T a, T b) {
    return a + b;
}

6. 静的メンバ変数の定義

1
2
3
4
5
6
7
// header.h
class MyClass {
    static int count;  // 宣言
};

// source.cpp
int MyClass::count = 0;  // 定義が必要

7. CMakeLists.txt でライブラリ追加

1
2
add_executable(my_program main.cpp utils.cpp)
target_link_libraries(my_program pthread ssl crypto)

8. nm コマンドで確認

1
2
# オブジェクトファイル内のシンボルを確認
nm -C utils.o | grep myFunction

よくある間違い

  • ヘッダファイルにインクルードガードがない(重複定義)
  • 仮想関数の実装を忘れている
  • リンク順序が間違っている(依存関係のあるライブラリは後に指定)
  • constexpr関数の定義がヘッダにない

C++ の他のエラー

最終更新: 2025-12-09