接口目标简述
根据当前的使用,将头文件编译成接口目标主要有两种应用场景:
- 若在开发过程中其他模块并不需要链接当前模块库,但是却需要与当前模块的一些头文件进行共享内存数据交换;
- 当前模块只包含头文件,而其它多个模块需要使用当前模块;
CMake接口目标实现方法
接口目标应用场景1实现方法
CMakeListst.txt编写
下面以代码为例子进行介绍:
add_library(test_icd INTERFACE)
target_link_libraries(test_icd INTERFACE
item1
item2)
target_include_directories(test_icd INTERFACE include)
在其它模块就可以通过在该模块的CMakeLists.txt
文件中添加以下语句来引用上述定义的接口库
target_link_libraries(other PUBLIC
test_icd)
头文件包含方式
此时在other
模块,当前模块的头文件路径就被展开,假设test.h
在include/test
路径下,在其它模块要使用该头文件时,可以通过以下方式使用:
include <test/test.h>
这种方式可以避免在使用该头文件的模块或者非同一路径下的源文件引用该头文件时使用../
这样的相对路径的方法或者在CMakeLists.txt
文件中通过include_directories
接口目标应用场景2实现方法
若当前模块只包含头文件,可以考虑将该模块编译成接口库(Interface Libraries)
。这里我们使用两种方式来实现。
CMakeLists.txt编写
- 方式1
add_library(test_icd INTERFACE) target_link_libraries(test_icd INTERFACE item1 item2) target_include_directories(test_icd INTERFACE include)
- 方式2
这种方式是编译静态库,然后并为该库通过set(HEADERS include/test/test.h) add_library(test_icd STATIC ${HEADERS}) target_compile_definitions(test_icd INTERFACE LIBRARY_HEADER_ONLY) target_include_directories(test_icd INTERFACE include) set_target_properties(test_icd PROPERTIES LINK_LANGUAGE CXX)
target_include_directories
指定头文件包含路径。
通过该种方式也可以实现编译接口库。
场景2中其他库引用接口库的头文件方式与场景1中相同,就不在重复叙述。