CMake 012:Linux平台动态库与可执行文件单文件构建指南

作者:袖梨 2026-05-31

在C/C++开发中,库的编译与链接是工程化开发的关键环节。本文将详细解析如何使用CMake高效管理动态库的完整生命周期,从编译到运行一步到位。

Bilibili 同步视频

一、静态库与动态库在CMake中的差异解析

初学者常误以为静态库和动态库的CMake配置差异很大,实际上两者的区别仅在于一个关键参数。通过CMake的add_library命令可以轻松实现两种库类型的切换。

  1. 静态库:add_library(xxx STATIC xxx.cpp)

  2. 动态库:add_library(xxx SHARED xxx.cpp)

若不指定类型,CMake会根据平台默认规则选择库类型。真正的差异在于查找时机:静态库仅需编译时存在,而动态库需要在编译和运行时都能被找到。

二、高效工程结构设计方案

推荐使用单一CMakeLists.txt管理整个项目,结构如下:

102-Cmake-Lib/
├── CMakeLists.txt
├── xlog/
│   ├── xlog.cpp
│   └── xlog.h
└── test-xlog/
    └── test-xlog.cpp

这种结构便于扩展,新增模块时无需拆分构建文件。

三、CMakeLists.txt配置详解

以下是完整的配置示例,包含详细注释:

cmake_minimum_required(VERSION 3.20)
project(XLOG)
add_library(xlog SHARED
    xlog/xlog.cpp
)
include_directories(xlog)
add_executable(test-xlog
    test-xlog/test-xlog.cpp
)
target_link_libraries(test-xlog
    xlog
)

配置要点说明

  1. SHARED参数决定生成动态库

  2. include_directories设置公共头文件路径

  3. target_link_libraries实现精确的库链接

四、编译运行全流程

1. 标准编译流程

cmake -S . -B build
cmake --build build

编译完成后将生成动态库文件和可执行程序。

2. 运行机制解析

CMake自动添加rpath绝对路径,确保运行时能正确找到动态库。通过ldd命令可以验证这一机制。

五、跨平台兼容性

本方案支持多平台:

  1. Linux:生成.so文件

  2. Mac:生成.dylib文件

  3. Windows:生成.dll和.lib文件

六、核心要点总结

  1. 静态/动态库仅需修改一个参数

  2. 动态库需要编译和运行时都能被找到

  3. 单一CMake文件管理更高效

  4. CMake自动处理库查找路径

  5. 方案支持多平台使用

img_6a1bc29c463dd30.webp

通过本文的完整方案,开发者可以轻松解决C/C++工程中的库管理难题,实现高效的跨平台开发。

相关文章

精彩推荐