在 Linux 下用 C++ 编译链接时出错,原因非常多,但 90% 都集中在以下几方面。下面我按最常见 → 较少见依次说明,并给出典型错误信息 + 解决方法,你可以对照排查。
| 现象 | 原因 | 解决 |
|---|---|---|
undefined reference to xxx |
只声明没定义 / 没链接库 | 补实现或加 -lxxx |
multiple definition of xxx |
头文件里定义变量/函数 | 改为 inline 或放 .cpp |
cannot find -lxxx |
找不到库 | 用 -L 指定路径 |
undefined symbol: _Z... |
C/C++ 链接不兼容 | extern "C" |
collect2: error: ld returned 1 exit status |
链接阶段失败 | 上面的错误导致 |
error while loading shared libraries |
运行时找不到 so | LD_LIBRARY_PATH / -rpath |
undefined reference to 'xxx'(最常见)// main.cpp
void foo();
int main() {
foo();
}
编译:
g++ main.cpp
错误:
undefined reference to `foo()'
✅ 原因
✅ 解决
// foo.cpp
void foo() {}
g++ main.cpp foo.cpp
#include <pthread.h>
pthread_create(...);
g++ main.cpp
错误:
undefined reference to `pthread_create'
✅ 解决
g++ main.cpp -lpthread
⚠️ 顺序很重要
# 错误
g++ -lpthread main.cpp
# 正确
g++ main.cpp -lpthread
/usr/bin/ld: cannot find -lmysqlclient
✅ 原因
✅ 解决
# 安装库
sudo apt install libmysqlclient-dev
# 或指定路径
g++ main.cpp -L/usr/local/lib -lmysqlclient
// a.h
int g_var = 10;
多个 .cpp 包含后:
multiple definition of `g_var'
✅ 解决
✅ 头文件只声明:
// a.h
extern int g_var;
// a.cpp
int g_var = 10;
undefined reference to `add'
而 add 是 C 函数
✅ 解决
extern "C" {
#include "add.h"
}
class A {
public:
void foo();
};
// main.cpp
A a;
a.foo();
错误:
undefined reference to `A::foo()'
✅ 解决
void A::foo() {}
❌ 模板实现放 .cpp
// foo.cpp
template<typename T>
void foo() {}
✅ 正确
// foo.h
template<typename T>
void foo() {}
g++ -c main.cpp
只生成 .o,没有最终可执行文件
✅ 解决
g++ main.o foo.o
| 阶段 | 关键字 |
|---|---|
| 编译 | error: variable/type/syntax |
| 链接 | undefined reference / multiple definition |
g++ -Wall -Wextra -g main.cpp foo.cpp -o app
你可以直接贴出:
我可以 精确告诉你是哪一行、为什么、怎么改 ✅