温馨提示×

Ubuntu下C++如何链接库

小樊
52
2026-07-06 23:34:52
栏目: 编程语言

在 Ubuntu 下用 C++ 链接库,通常分为 编译期链接期 两个阶段。下面按常见场景给你一个完整说明。


一、基本概念

  • 头文件(.h):编译时需要,告诉编译器接口
  • 库文件(.a / .so):链接时需要,提供实现
  • 库类型
    • .a静态库
    • .so动态库(共享库)

二、使用系统已安装的库(最常见)

示例:使用 libpthread

#include <pthread.h>

int main() {
    return 0;
}

编译并链接:

g++ main.cpp -o main -lpthread

-l 表示链接库
✅ 库名是 pthread,对应 /lib/x86_64-linux-gnu/libpthread.so


三、使用第三方库(如 OpenCV、Boost)

1️⃣ 安装库(示例:OpenCV)

sudo apt update
sudo apt install libopencv-dev

2️⃣ 编译链接

g++ main.cpp -o main `pkg-config --cflags --libs opencv4`

或者手动:

g++ main.cpp -o main \
-I/usr/include/opencv4 \
-L/usr/lib/x86_64-linux-gnu \
-lopencv_core -lopencv_imgproc -lopencv_highgui

四、链接自己写的库

1️⃣ 写库代码

mylib.h

#pragma once
void hello();

mylib.cpp

#include <iostream>
void hello() {
    std::cout << "Hello Library\n";
}

main.cpp

#include "mylib.h"
int main() {
    hello();
}

2️⃣ 编译成静态库(.a)

g++ -c mylib.cpp -o mylib.o
ar rcs libmylib.a mylib.o

链接:

g++ main.cpp -o main -L. -lmylib

-L.:在当前目录找库
-lmyliblibmylib.a


3️⃣ 编译成动态库(.so)

g++ -fPIC -shared mylib.cpp -o libmylib.so

链接:

g++ main.cpp -o main -L. -lmylib

运行时需要让系统找到 .so

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main

或安装到系统:

sudo cp libmylib.so /usr/lib/
sudo ldconfig

五、使用 CMake(推荐)

示例 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(demo)

add_library(mylib SHARED mylib.cpp)

add_executable(main main.cpp)
target_link_libraries(main mylib)

构建:

mkdir build
cd build
cmake ..
make

六、常见错误与解决

undefined reference to xxx

  • 忘记 -lxxx
  • 链接顺序错误(被依赖的库放后面)

cannot find -lxxx

  • 没安装库
  • -L 路径不对

error while loading shared libraries

  • .so 不在动态库搜索路径
  • 使用 LD_LIBRARY_PATHldconfig

七、常用命令速查

# 查看库依赖
ldd ./main

# 查看库导出符号
nm libxxx.so

# 查找库位置
locate libxxx.so

如果你有具体库名(如 Boost、OpenCV、CUDA、protobuf)或报错信息,可以贴出来,我可以针对你的情况详细讲。

0