Linux 下 C++ 链接失败(link error)通常不是语法问题,而是编译通过、但链接阶段找不到定义。下面按最常见原因 → 现象 → 解决办法给你梳理。
// a.h
void foo();
// main.cpp
int main() {
foo(); // 链接错误
}
错误类似:
undefined reference to `foo()`
✅ 解决:
foo()foo() 的 .o / .a / .sog++ main.cpp
如果 foo() 在 foo.cpp 里,就会链接失败。
✅ 正确:
g++ main.cpp foo.cpp
或:
g++ main.cpp foo.o
例如用 pthread、math:
#include <pthread.h>
pthread_create(...);
g++ main.cpp
❌ 错误:
undefined reference to `pthread_create`
✅ 正确:
g++ main.cpp -lpthread
g++ main.cpp -lm
Linux 链接是“从左到右”
❌ 错误:
g++ -lmylib main.cpp
✅ 正确:
g++ main.cpp -lmylib
规则:
被依赖的库放后面
// mylib.c
void foo() {}
// main.cpp
void foo(); // ❌
✅ 正确:
extern "C" {
void foo();
}
或头文件中:
#ifdef __cplusplus
extern "C" {
#endif
void foo();
#ifdef __cplusplus
}
#endif
// a.h
template<typename T>
void foo(T t);
// a.cpp
template<typename T>
void foo(T t) {}
❌ 链接错误
✅ 解决:
static void foo() {}
如果在别的 .cpp 用,就会找不到。
./a.out: error while loading shared libraries
✅ 解决:
export LD_LIBRARY_PATH=./lib
或:
g++ main.cpp -L./lib -lmylib -Wl,-rpath,./lib
| 信息 | 含义 |
|---|---|
| undefined reference | 没实现 / 没链接 |
| multiple definition | 重复定义 |
| cannot find -lxxx | 库路径不对 |
| skipping incompatible | 架构不匹配(32/64) |
g++ main.cpp foo.cpp -Iinclude -Llib -lmylib -lpthread -o app
你可以直接贴:
我可以帮你精准定位是哪一条原因。