温馨提示×

ubuntu c++如何链接库

小樊
37
2026-09-02 08:51:58
栏目: 编程语言

在 Ubuntu 下用 C++ 链接库,通常分 系统已安装库自己编译的库 两种情况。下面从基础到常见场景讲清楚。


一、基本概念

库分两种:

  • 静态库.a 文件(编译时直接打包进程序)
  • 动态库.so 文件(运行时加载)

链接方式:

  • 编译时:告诉编译器库在哪、用哪个库
  • 运行时(动态库):告诉系统库在哪

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

示例:链接 pthread(线程库)

g++ main.cpp -o main -lpthread

示例:链接 opencv

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

常用参数说明:

  • -I :头文件路径
  • -L :库文件路径
  • -lxxx :链接 libxxx.solibxxx.a

⚠️ 注意:

  • -l 后面 不要写 lib 和扩展名
  • -l 要放在源文件后面

三、链接自己编译的库

1️⃣ 编译静态库

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

使用:

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

2️⃣ 编译动态库

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

使用:

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

运行前还要指定动态库路径:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main

或把 .so 放到:

/usr/lib
/usr/local/lib

然后执行:

sudo ldconfig

四、用 CMake 链接库(推荐)

链接系统库

find_package(OpenCV REQUIRED)
target_link_libraries(main ${OpenCV_LIBS})

链接自己的库

add_library(mylib SHARED mylib.cpp)
target_link_libraries(main mylib)

五、常见错误

undefined reference

  • 顺序错了:g++ -lmylib main.cpp(错误)
  • 正确:g++ main.cpp -lmylib

❌ 找不到 .so

  • 没设置 LD_LIBRARY_PATH
  • 没执行 ldconfig

❌ 头文件找不到

  • 没加 -I

六、快速检查命令

# 看程序依赖的库
ldd ./main

# 看库里有什么符号
nm -D libmylib.so

如果你有 具体库名(如 boost / protobuf / cuda)报错信息,可以直接贴出来,我可以给你精确命令。

0