CMake學些筆記-將頭文件的代碼組織編譯成接口庫(接口目標)

CMake將頭文件的代碼組織編譯成接口庫(接口目標)

接口目標簡述

根據當前的使用,將頭文件編譯成接口目標主要有兩種應用場景:

  1. 若在開發過程中其他模塊並不需要鏈接當前模塊庫,但是卻需要與當前模塊的一些頭文件進行共享內存數據交換;
  2. 當前模塊只包含頭文件,而其它多個模塊需要使用當前模塊;

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.hinclude/test路徑下,在其它模塊要使用該頭文件時,可以通過以下方式使用:

include <test/test.h>

這種方式可以避免在使用該頭文件的模塊或者非同一路徑下的源文件引用該頭文件時使用../這樣的相對路徑的方法或者在CMakeLists.txt文件中通過include_directories

接口目標應用場景2實現方法

若當前模塊只包含頭文件,可以考慮將該模塊編譯成接口庫(Interface Libraries)。這裏我們使用兩種方式來實現。

CMakeLists.txt編寫

  1. 方式1
    add_library(test_icd INTERFACE)
    target_link_libraries(test_icd INTERFACE 
    								item1
    								item2)
    target_include_directories(test_icd INTERFACE include)
    
  2. 方式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中相同,就不在重複敘述。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章