0%

动态链接库与CMake

💡 TIP

CMake 和动态链接库(DLL 或共享库)关系密切,因为 CMake 是一种构建工具,可以用来生成、管理和使用动态链接库。通过 CMake,可以轻松地定义动态库的构建规则,并在项目中加载或链接这些库。

CMake 与动态链接库的关系

CMake 和动态链接库(DLL 或共享库)关系密切,因为 CMake 是一种构建工具,可以用来生成、管理和使用动态链接库。通过 CMake,可以轻松地定义动态库的构建规则,并在项目中加载或链接这些库。


CMake 如何生成动态链接库

动态链接库(Dynamic Link Library,Windows 下通常是 .dll,Linux 下是 .so,macOS 下是 .dylib)的构建需要指定库的类型。CMake 提供了灵活的机制来创建动态库。

示例:创建动态链接库

项目结构:

1
2
3
4
5
6
7
8
9
project/
├── CMakeLists.txt
├── library/
│ ├── CMakeLists.txt
│ ├── my_library.cpp
│ └── my_library.h
├── app/
│ ├── CMakeLists.txt
│ └── main.cpp

1. 编写动态库的代码

library/my_library.h:

1
2
3
4
5
6
#ifndef MY_LIBRARY_H
#define MY_LIBRARY_H

int add(int a, int b);

#endif

library/my_library.cpp:

1
2
3
4
5
#include "my_library.h"

int add(int a, int b) {
return a + b;
}

2. 编写 library/CMakeLists.txt

1
2
3
4
5
6
7
add_library(my_library SHARED my_library.cpp)

# 设置库的输出名称(可选)
set_target_properties(my_library PROPERTIES OUTPUT_NAME "my_dynamic_library")

# 指定库头文件供外部使用
target_include_directories(my_library PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

SHARED 标志表示生成动态链接库。如果需要生成静态库,可以将其替换为 STATIC


3. 使用动态链接库

app/main.cpp:

1
2
3
4
5
6
7
#include <iostream>
#include "my_library.h"

int main() {
std::cout << "2 + 3 = " << add(2, 3) << std::endl;
return 0;
}

4. 编写 app/CMakeLists.txt

1
2
3
4
add_executable(my_app main.cpp)

# 链接动态库
target_link_libraries(my_app PRIVATE my_library)

5. 根目录 CMakeLists.txt

1
2
3
4
5
6
cmake_minimum_required(VERSION 3.10)
project(DynamicLibraryExample)

# 添加子目录
add_subdirectory(library)
add_subdirectory(app)

6. 构建和运行

在项目根目录执行以下命令:

1
2
3
4
5
# 生成构建系统
cmake -S . -B build

# 构建项目
cmake --build build

运行生成的可执行文件:

1
./build/app/my_app

CMake 使用动态库的常见场景

  1. 动态加载动态库
    通过操作系统接口(如 dlopenLoadLibrary)加载动态库并调用其函数。

    1
    2
    #include <dlfcn.h> // Linux/macOS
    void* handle = dlopen("my_dynamic_library.so", RTLD_LAZY);
  2. 查找系统动态库
    使用 CMake 的 find_library 命令查找系统中已安装的动态库。

    1
    2
    find_library(MY_LIB my_library PATHS /usr/lib /usr/local/lib)
    target_link_libraries(my_app PRIVATE ${MY_LIB})
  3. 安装动态库
    配置安装规则,将动态库安装到指定路径。

    1
    2
    install(TARGETS my_library DESTINATION lib)
    install(FILES my_library.h DESTINATION include)
  4. 控制动态库版本
    CMake 支持为动态库设置版本号,用于兼容性管理。

    1
    set_target_properties(my_library PROPERTIES VERSION 1.0 SOVERSION 1)

动态库的优点通过 CMake 放大

  1. 模块化构建
    动态库可与多个项目共享,CMake 管理动态库的构建和链接更加简单。

  2. 跨平台兼容
    CMake 抽象了不同平台的动态库细节(如 .dll.so 的差异),开发者只需专注于库的功能实现。

  3. 依赖关系管理
    CMake 能自动处理动态库的依赖,确保库按正确顺序链接。

  4. 动态库的安装和部署
    使用 CMake,可以轻松地将动态库与项目一起打包并分发。


总结

CMake 与动态链接库密切相关,是开发和管理动态库的理想工具。通过 CMake,可以轻松完成动态库的创建、链接、加载、安装和跨平台管理,显著简化复杂项目的开发流程。

如需进一步了解动态库的特定实现或动态加载,可以提供更详细的场景!


(完)