在 CMake 中,add_library 命令用于向项目添加一个库文件,并定义其类型(静态库或共享库)。这个命令是管理库文件的主要方法之一,用于指定源文件、依赖项和其他相关设置。
基本语法
add_library(target_name [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
- target_name: 库文件的名称,通常是不带扩展名的名字,如 my_library。
- [STATIC | SHARED | MODULE]: 指定库文件的类型,可选参数。默认为 STATIC 静态库。
- STATIC: 静态库,会被链接到其他目标的可执行文件中。
- SHARED: 共享库(动态库),在运行时动态加载到内存中。
- MODULE: 在某些平台上的插件库类型。
- [EXCLUDE_FROM_ALL]: 可选参数,如果设置,则将该库文件排除在 make all 或 build 目标之外。
- source1, source2, …: 库文件的源文件列表,可以是源文件的路径或变量。
示例
以下是几个使用 add_library 命令的示例:
1. 添加静态库
cmake_minimum_required(VERSION 3.10)
project(StaticLibraryExample)
# 添加静态库
add_library(my_static_lib STATIC
src/file1.cpp
src/file2.cpp
)
# 将静态库的头文件目录包含在编译路径中
target_include_directories(my_static_lib PUBLIC include)
在这个示例中,我们创建了一个名为 my_static_lib 的静态库,并将 src/file1.cpp 和 src/file2.cpp 作为库文件的源文件。通过 target_include_directories 命令将 include 目录添加到静态库的头文件搜索路径中,使得其他目标可以访问到这些头文件。
2. 添加共享库(动态库)
cmake_minimum_required(VERSION 3.10)
project(SharedLibraryExample)
# 添加共享库
add_library(my_shared_lib SHARED
src/library.cpp
)
# 设置共享库的版本号
set_target_properties(my_shared_lib PROPERTIES
VERSION 1.2.3
SOVERSION 1
)
在这个示例中,我们创建了一个名为 my_shared_lib 的共享库,并将 src/library.cpp 作为共享库的源文件。使用 set_target_properties 命令设置了共享库的版本号,VERSION 表示库的版本,SOVERSION 表示库的主版本号。
3. 排除库文件
cmake_minimum_required(VERSION 3.10)
project(ExcludeLibraryExample)
# 添加库文件,并排除在所有目标之外
add_library(my_lib STATIC EXCLUDE_FROM_ALL
src/main.cpp
src/helper.cpp
)
# 添加可执行目标,依赖于库文件
add_executable(my_program
app/main.cpp
)
target_link_libraries(my_program PRIVATE my_lib)
在这个示例中,我们创建了一个名为 my_lib 的静态库,并使用 EXCLUDE_FROM_ALL 参数将其排除在 make all 或 build 目标之外。然后,我们创建了一个可执行目标 my_program,并将 my_lib 库文件链接到该目标中。
注意事项
- 库文件类型: 使用 STATIC、SHARED 或 MODULE 参数来明确指定库文件的类型,这决定了库文件的链接方式和行为。
- 源文件路径: 可以使用相对路径或绝对路径指定库文件的源文件,这些文件将会被编译为库文件。
- 目标属性: 使用 set_target_properties 命令可以进一步设置库文件的属性,如输出名称、编译选项等。
结论
add_library 命令是 CMake 中管理库文件的核心命令之一,通过它可以定义并配置静态库、共享库等不同类型的库文件。合理使用 add_library 命令可以帮助组织和管理项目中的模块化代码,提高项目的可维护性和灵活性。