目录
在第一节 CMake 教程(一)初识 CMake 中,我们已经了解和实现了通过 CMake 来创建一个基本项目。本节我们将通过两个实例来学习如何在项目中创建和使用库。
一、实例一——创建库
1、add_library
要在 CMake
中添加库,就需要使用 add_library
命令来指定哪些源文件应组成库。
add_library(<name> [<type>] [EXCLUDE_FROM_ALL] <sources>...)
其作用为:添加一个名为 <name>
的库目标,该目标要从命令调用中列出的源文件构建。
参数说明:
<name>
对应于逻辑目标名称,并且在项目中必须是全局唯一的。构建的库的实际文件名是根据本机平台的约定(例如lib<name>.a
或<name>.lib
)构建的。- 可选的
<type>
指定要创建的库的类型:STATIC
:链接其他目标时使用的目标文件存档。SHARED
:一个动态库,可以由其他目标链接并在运行时加载。MODULE
:一个插件,它不能被其他目标链接,但可以在运行时使用类似 dlopen 的功能动态加载。
如果未给出
<type>
,则默认值为STATIC
或SHARED
2、target_include_directories()、target_link_libraries()
我们可以使用一个或多个子目录来组织项目,而不是将所有源文件放在一个目录中。在这种情况下,我们将专门为我们的库创建一个子目录。在这里,我们可以添加新的 CMakeLists.txt
文件和一个或多个源文件。在顶级 CMakeLists.txt
文件中,我们将使用 add_subdirectory()
命令将子目录添加到构建中。
创建库后,它通过 target_include_directories()
和 target_link_libraries()
连接到我们的可执行目标。
2.1 target_include_directories()
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
指定编译给定目标(例如可执行文件、库等)时要使用的包含目录。命名的 <target>
必须由 add_executable()
或 add_library()
等命令创建,并且不能是 ALIAS
目标。
target
:目标名称,可以是一个可执行文件、静态库或动态库的名称。SYSTEM
:可选参数,指定包含目录是否应被视为系统目录。表示编译器不会产生警告。[AFTER|BEFORE]
:可选参数:BEFORE
:参数用于将包含目录添加到已有的包含目录之前,即在搜索其他包含目录之前搜索指定的目录。AFTER
:参数用于将包含目录添加到已有的包含目录之后,即在搜索其他包含目录之后搜索指定的目录。
<INTERFACE|PUBLIC|PRIVATE>
:可选参数,指定添加的包含目录的属性。INTERFACE
:目标的接口包含目录,这意味着只有依赖该目标的其他目标才能看到这个包含目录。对于依赖该目标的目标来说,这个包含目录会像是它自己的接口一样可见。PUBLIC
:目标的公共包含目录,这意味着该目标及依赖它的其他目标都可以看到这个包含目录。PRIVATE
:目标的私有包含目录,只有该目标自身才可见这个包含目录。
item1...
:需要添加的包含目录。