在 CMake 中,add_library
命令用于创建一个库,可以是静态库、共享库或接口库。接口库是一种特殊类型的库,它不生成任何实际的库文件,而是用于传播编译选项、链接库、包含目录等信息。
使用 INTERFACE
创建接口库
接口库是一个没有实际构建产物的库,主要用于定义和传播一些编译选项和依赖项。接口库不会生成二进制文件,但可以被其他目标链接使用,通常用于构建公共接口。
示例:创建和使用接口库
-
定义接口库:
cmake_minimum_required(VERSION 3.10) # 确保使用的 CMake 版本 project(MyProject) # 创建一个接口库 add_library(MyInterfaceLib INTERFACE) # 设置接口库的编译选项 target_compile_definitions(MyInterfaceLib INTERFACE MY_DEFINE=1) target_include_directories(MyInterfaceLib INTERFACE ${CMAKE_SOURCE_DIR}/include)
在这个示例中,
MyInterfaceLib
是一个接口库。target_compile_definitions
用于设置编译器定义,target_include_directories
用于指定头文件目录。 -
将接口库与其他目标链接:
# 创建一个可执行文件 add_executable(MyExecutable main.cpp) # 链接接口库 target_link_libraries(MyExecutable PRIVATE MyInterfaceLib)
在这里,
MyExecutable
是一个可执行目标,它链接了MyInterfaceLib
接口库。这意味着MyExecutable
将使用MyInterfaceLib
中定义的编译选项和包含目录。 -
接口库的传播:
如果你有另一个目标,如一个库,可以将接口库作为依赖传递给它:
add_library(MyOtherLib STATIC otherlib.cpp) # 链接接口库 target_link_libraries(MyOtherLib PUBLIC MyInterfaceLib)
在这个例子中,
MyOtherLib
库将继承MyInterfaceLib
的所有设置,因为它使用了PUBLIC
链接。PUBLIC
表示MyOtherLib
的使用者也将继承MyInterfaceLib
的编译选项和包含目录。
总结
INTERFACE
:创建一个接口库,没有实际的构建产物。用于传播编译选项、包含目录、链接库等。add_library(MyLib INTERFACE)
:定义一个接口库。target_link_libraries(Target INTERFACE MyLib)
:将接口库MyLib
链接到目标Target
,使其获得MyLib
的所有设置。
接口库在管理大型项目或库时非常有用,可以帮助保持构建系统的整洁和模块化。