CMake 和动态链接库(DLL 或共享库)关系密切,因为 CMake 是一种构建工具,可以用来生成、管理和使用动态链接库。通过 CMake,可以轻松地定义动态库的构建规则,并在项目中加载或链接这些库。
¶CMake 与动态链接库的关系
CMake 和动态链接库(DLL 或共享库)关系密切,因为 CMake 是一种构建工具,可以用来生成、管理和使用动态链接库。通过 CMake,可以轻松地定义动态库的构建规则,并在项目中加载或链接这些库。
¶CMake 如何生成动态链接库
动态链接库(Dynamic Link Library,Windows 下通常是 .dll,Linux 下是 .so,macOS 下是 .dylib)的构建需要指定库的类型。CMake 提供了灵活的机制来创建动态库。
¶示例:创建动态链接库
项目结构:
1 | project/ |
¶1. 编写动态库的代码
library/my_library.h:
1 |
|
library/my_library.cpp:
1 |
|
¶2. 编写 library/CMakeLists.txt
1 | add_library(my_library SHARED my_library.cpp) |
SHARED 标志表示生成动态链接库。如果需要生成静态库,可以将其替换为 STATIC。
¶3. 使用动态链接库
app/main.cpp:
1 |
|
¶4. 编写 app/CMakeLists.txt
1 | add_executable(my_app main.cpp) |
¶5. 根目录 CMakeLists.txt
1 | cmake_minimum_required(VERSION 3.10) |
¶6. 构建和运行
在项目根目录执行以下命令:
1 | # 生成构建系统 |
运行生成的可执行文件:
1 | ./build/app/my_app |
¶CMake 使用动态库的常见场景
-
动态加载动态库
通过操作系统接口(如dlopen和LoadLibrary)加载动态库并调用其函数。1
2
void* handle = dlopen("my_dynamic_library.so", RTLD_LAZY); -
查找系统动态库
使用 CMake 的find_library命令查找系统中已安装的动态库。1
2find_library(MY_LIB my_library PATHS /usr/lib /usr/local/lib)
target_link_libraries(my_app PRIVATE ${MY_LIB}) -
安装动态库
配置安装规则,将动态库安装到指定路径。1
2install(TARGETS my_library DESTINATION lib)
install(FILES my_library.h DESTINATION include) -
控制动态库版本
CMake 支持为动态库设置版本号,用于兼容性管理。1
set_target_properties(my_library PROPERTIES VERSION 1.0 SOVERSION 1)
¶动态库的优点通过 CMake 放大
-
模块化构建
动态库可与多个项目共享,CMake 管理动态库的构建和链接更加简单。 -
跨平台兼容
CMake 抽象了不同平台的动态库细节(如.dll和.so的差异),开发者只需专注于库的功能实现。 -
依赖关系管理
CMake 能自动处理动态库的依赖,确保库按正确顺序链接。 -
动态库的安装和部署
使用 CMake,可以轻松地将动态库与项目一起打包并分发。
¶总结
CMake 与动态链接库密切相关,是开发和管理动态库的理想工具。通过 CMake,可以轻松完成动态库的创建、链接、加载、安装和跨平台管理,显著简化复杂项目的开发流程。
如需进一步了解动态库的特定实现或动态加载,可以提供更详细的场景!