当前位置: 首页 > news >正文

CMake 生成静态库、动态库

在 CMake 中,生成静态库(Static Library)或动态库(Shared Library)非常简单。CMake 提供了 add_library 命令来定义库文件,并通过参数指定库的类型(静态库或动态库)。以下是详细的步骤和示例:


1. 生成静态库

静态库在编译时会被完整地链接到可执行文件中,生成的文件扩展名通常为 .lib(Windows)或 .a(Linux/macOS)。

示例代码
cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)

# 添加静态库
add_library(MyStaticLibrary STATIC src/utils.cpp)

# 设置静态库的输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
说明
  • add_library(MyStaticLibrary STATIC src/utils.cpp)
    • MyStaticLibrary 是库的名称。
    • STATIC 表示生成静态库。
    • src/utils.cpp 是库的源文件。
  • CMAKE_ARCHIVE_OUTPUT_DIRECTORY:用于设置静态库的输出目录。

2. 生成动态库

动态库在运行时被加载,生成的文件扩展名通常为 .dll(Windows)或 .so(Linux/macOS)。

示例代码
cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)

# 添加动态库
add_library(MySharedLibrary SHARED src/utils.cpp)

# 设置动态库的输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
说明
  • add_library(MySharedLibrary SHARED src/utils.cpp)
    • MySharedLibrary 是库的名称。
    • SHARED 表示生成动态库。
    • src/utils.cpp 是库的源文件。
  • CMAKE_LIBRARY_OUTPUT_DIRECTORY:用于设置动态库的输出目录。

3. 同时生成静态库和动态库

如果需要同时生成静态库和动态库,可以定义两个不同的目标:

示例代码
cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)

# 添加静态库
add_library(MyStaticLibrary STATIC src/utils.cpp)

# 添加动态库
add_library(MySharedLibrary SHARED src/utils.cpp)

# 设置输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 静态库
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 动态库

4. 设置库的版本和导出符号

对于动态库,通常需要设置版本号和导出符号。

示例代码
cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)

# 添加动态库
add_library(MySharedLibrary SHARED src/utils.cpp)

# 设置库的版本号
set_target_properties(MySharedLibrary PROPERTIES
    VERSION 1.0.0
    SOVERSION 1
)

# 导出符号(Windows 下需要)
if (WIN32)
    target_compile_definitions(MySharedLibrary PRIVATE MYSHAREDLIBRARY_EXPORTS)
endif()
说明
  • VERSIONSOVERSION:用于设置库的版本号。
  • target_compile_definitions:在 Windows 下,通常需要导出符号(通过 __declspec(dllexport))。

5. 链接库文件

生成库文件后,可以在其他目标中链接这些库。

示例代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 添加可执行文件
add_executable(MyProgram main.cpp)

# 链接静态库
target_link_libraries(MyProgram MyStaticLibrary)

# 或者链接动态库
target_link_libraries(MyProgram MySharedLibrary)

6. 完整示例

以下是一个完整的示例,展示如何生成静态库和动态库,并在可执行文件中链接它们:

cmake_minimum_required(VERSION 3.10)
project(MyLibraryProject)

# 设置输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 静态库
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 动态库
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) # 可执行文件

# 添加静态库
add_library(MyStaticLibrary STATIC src/utils.cpp)

# 添加动态库
add_library(MySharedLibrary SHARED src/utils.cpp)

# 设置动态库的版本号
set_target_properties(MySharedLibrary PROPERTIES
    VERSION 1.0.0
    SOVERSION 1
)

# 添加可执行文件
add_executable(MyProgram main.cpp)

# 链接静态库
target_link_libraries(MyProgram MyStaticLibrary)

# 或者链接动态库
target_link_libraries(MyProgram MySharedLibrary)

7. 构建项目

在项目根目录下运行以下命令来构建项目:

mkdir build
cd build
cmake ..
cmake --build .

构建完成后:

  • 静态库会生成在 build/lib/ 目录下(如 libMyStaticLibrary.aMyStaticLibrary.lib)。
  • 动态库会生成在 build/lib/ 目录下(如 libMySharedLibrary.soMySharedLibrary.dll)。
  • 可执行文件会生成在 build/bin/ 目录下。

总结

  • 使用 add_library 生成静态库(STATIC)或动态库(SHARED)。
  • 通过 CMAKE_ARCHIVE_OUTPUT_DIRECTORYCMAKE_LIBRARY_OUTPUT_DIRECTORY 设置库的输出目录。
  • 使用 target_link_libraries 链接库文件到可执行文件。
  • 动态库可以设置版本号和导出符号(特别是在 Windows 下)。

相关文章:

  • Java集合简单理解
  • Authenticity is the compass that guides you to your true purpose
  • 【大模型实战篇】使用GPTQ量化QwQ-32B微调后的推理模型
  • Solopi使用文档
  • 开源链动 2+1 模式 AI 智能名片 S2B2C 商城小程序助力社群发展中榜样影响力的提升
  • 【Spring】Spring整合以及事务控制
  • Docker和 Docker Compose安装MySQL:快速搭建数据库环境
  • 编程题-第k个语法符号
  • 《P4387 【深基15.习9】验证栈序列》
  • 一分钟了解深度学习
  • 统计数字字符个数(信息学奥赛一本通-1129)
  • 2025-03-16 学习记录--C/C++-PTA 练习4-10 找出最小值
  • java学习总结(八):Spring boot
  • 海洋难抵极:尼莫点
  • LabVIEW生成EXE文件错误提示
  • 计算机基础:二进制基础12,十进制数转换为十六进制
  • AtCoder Beginner Contest 397(ABCDE)
  • 加固脱壳技术:DEX动态加载对抗
  • #pragma omp critical解析
  • 【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet
  • 康子兴评《文明的追求》|野人脚印:鲁滨逊的恐惧与文明焦虑
  • 明明睡够了,怎么还有黑眼圈?可能是身体在求救
  • 读图|展现城市品格,上海城市影像走进南美
  • 美英达成贸易协议,美股集体收涨
  • 司法部:加快研究制定行政执法监督条例,建立完善涉企行政执法监督长效机制
  • 陕西澄城打造“中国樱桃第一县”:从黄土高原走向海外,年产值超30亿