在 Ubuntu 下用 C++ 编译时报“链接错误”(link error),通常不是语法问题,而是编译通过、但链接阶段找不到定义。下面按最常见原因 → 排查方法给你系统讲一下。
典型报错:
undefined reference to `foo()'
void foo(); // 声明
// 没有实现
g++ main.cpp # 忘记加 foo.cpp
✅ 正确:
g++ main.cpp foo.cpp
比如用 pthread、std::thread、OpenCV、Boost
std::thread t([]{});
错误:
g++ main.cpp
✅ 正确:
g++ main.cpp -pthread
#include <cmath>
double x = sqrt(2);
✅:
g++ main.cpp -lm
class A {
public:
void foo();
};
如果 A::foo() 没写:
undefined reference to `A::foo()'
模板必须在头文件实现
❌ 错误:
// foo.h
template<typename T>
void foo();
// foo.cpp
template<typename T>
void foo() {}
✅ 正确:
实现也写在 .h 或 .hpp 中
C 库在 C++ 中用:
extern "C" {
#include "mylib.h"
}
否则会:
undefined reference to `my_func'
❌ 错误:
g++ -lopencv_core main.cpp
✅ 正确:
g++ main.cpp -lopencv_core
你遇到链接错时,按这个顺序查:
如果你愿意,把:
贴出来,我可以直接帮你精确定位是哪一条原因。