CMake 012Linux 下动态库与可执行程序的单文件构建Bilibili 同步视频一、先搞懂静态库 vs 动态库CMake 编译差在哪二、工程结构设计一个 CMakeLists 管到底三、核心 CMakeLists.txt 编写逐行解析关键配置说明四、编译 运行一键执行运行不报错1. 标准编译命令2. 运行验证为什么不用改 LD_LIBRARY_PATH五、跨平台小提示六、总结Bilibili 同步视频CMake 012Linux 下动态库与可执行程序的单文件构建在 C/C 工程化开发里库的编译与链接是绕不开的核心环节而静态库与动态库的差异更是很多开发者从 “能跑通” 到 “做得稳” 的必经之路。今天就用最清晰的思路带你用 CMake 把动态库编译、链接、运行时查找一次性讲透全程一个CMakeLists.txt搞定Linux 环境直接复用一、先搞懂静态库 vs 动态库CMake 编译差在哪很多刚接触 CMake 的同学会疑惑静态库和动态库编译配置是不是天差地别答案是几乎一样CMake 本身就是为了简化构建流程设计的两者的核心差异只在add_library的一个关键字静态库add_library(xxx STATIC xxx.cpp)动态库add_library(xxx SHARED xxx.cpp)不加关键字时会走 CMake 默认规则不同环境默认值不同有的默认动态、有的默认静态。只需要把STATIC换成SHARED就能无缝切换库类型这也是 CMake 高效的核心体现。除了编译标识两者最关键的区别在查找时机✅ 静态库仅编译期需要找到库文件链接后会打包进可执行程序运行时无依赖✅ 动态库编译期 运行期都需要找到库文件运行时系统会动态加载体积更小、便于更新。这也是动态库最容易踩坑的点编译过了运行却提示 “找不到库”后文会给出 CMake 原生解决方案不用手动改环境变量二、工程结构设计一个 CMakeLists 管到底以往我们习惯把库、测试程序分两个CMakeLists.txt管理这次直接合并到一个文件同时编译动态库 可执行程序工程结构如下102-Cmake-Lib/ ├── CMakeLists.txt # 总构建文件核心 ├── xlog/ # 动态库源码 │ ├── xlog.cpp │ └── xlog.h └── test-xlog/ # 测试可执行程序 └── test-xlog.cpp所有构建逻辑都写在根目录的CMakeLists.txt里后续加模块、加库都能直接扩展不用拆分成多个文件。三、核心 CMakeLists.txt 编写逐行解析直接上可运行的完整配置每一步都标注清楚复制就能用# 1. 指定CMake最低版本兼容现代特性 cmake_minimum_required(VERSION 3.20) # 2. 定义项目名称主库为xlog测试程序为附属 project(XLOG) # 3. 编译动态库xlogSHARED 动态库标识 # 源文件路径子目录xlog下的xlog.cpp add_library(xlog SHARED xlog/xlog.cpp ) # 4. 设置公共头文件路径所有目标共享 # 让test-xlog能找到xlog.h include_directories(xlog) # 5. 编译可执行程序test-xlog # 源文件路径子目录test-xlog下的test-xlog.cpp add_executable(test-xlog test-xlog/test-xlog.cpp ) # 6. 链接动态库给test-xlog关联xlog库 target_link_libraries(test-xlog xlog )关键配置说明SHARED** 关键字**强制编译为动态库Linux 下输出.so、Mac 下.dylib、Windows 下.dllinclude_directories公共头文件路径避免手动在每个目标里重复配置target_link_libraries目标级链接只给test-xlog绑定xlog库耦合度更低。四、编译 运行一键执行运行不报错1. 标准编译命令# 生成构建文件输出到build目录cmake-S.-Bbuild# 编译工程cmake--buildbuild编译完成后进入build目录能看到生成的文件动态库libxlog.soLinux 核心动态库文件可执行程序test-xlog2. 运行验证为什么不用改 LD_LIBRARY_PATH直接运行测试程序cdbuild ./test-xlog神奇的是不用 export LD_LIBRARY_PATH也能正常运行用ldd查看依赖库路径真相一目了然ldd test-xlog输出结果里libxlog.so指向的是绝对路径这是 CMake 自动帮我们添加的编译参数-Wl,-rpath/xxx/102-Cmake-Lib/build手动 GCC 编译必须自己加-Wl,-rpath或改环境变量否则运行报错CMake 编译自动注入 rpath 绝对路径运行时直接定位库文件零配置运行。即使把test-xlog复制到其他目录依然能正常执行只有删除原动态库后才会去系统默认库路径查找完美规避运行时找不到库的问题。五、跨平台小提示这套配置不只是 Linux 能用跨平台直接兼容Linux动态库 →.soMac动态库 →.dylibWindows动态库 →.dll.libCMake 会自动根据系统适配输出格式不用修改任何配置真正做到 “一次编写多平台运行”。六、总结CMake 编译静态 / 动态库仅差STATIC/SHARED一个关键字动态库需编译期 运行期查找库静态库仅编译期需要单文件CMakeLists.txt可同时管理库 可执行程序结构更简洁CMake 自动添加rpath绝对路径Linux 运行动态库不用改环境变量配置跨平台兼容复制即用适配 Linux/Mac/Windows。掌握这套流程C/C 工程的库编译、链接、运行问题基本都能轻松解决