接口目標簡述
根據當前的使用,將頭文件編譯成接口目標主要有兩種應用場景:
- 若在開發過程中其他模塊並不需要鏈接當前模塊庫,但是卻需要與當前模塊的一些頭文件進行共享內存數據交換;
- 當前模塊只包含頭文件,而其它多個模塊需要使用當前模塊;
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中相同,就不在重複敘述。