[英]How to create a cmake header-only library that depends on external non-header-only target?
[英]How to create a cmake header-only library that depends on external header files?
我有一個具有以下文件結構的項目:
project
|
|-------> lib1
| |----> lib1.h
|
|-------> lib2
| |----> lib2.h
|
|-------> main.cc
兩個libs lib1
和lib2
只包含頭文件,而lib2.h
包含lib1.h
, main.cc
包含lib2.h
我現在如何為這個項目編寫cmake文件? 我試圖為lib2
創建一個接口庫 ,但編譯器找不到lib1.h
以下是我的cmake文件的內容:
lib2的CMakeLists.txt:
add_library(lib2 INTERFACE)
target_sources(lib2 INTERFACE lib2.h)
target_include_directories(lib2 INTERFACE ../lib1/lib1.h)
整個項目的CMakeLists.txt:
add_executable(project main.cc)
target_link_libraries(project lib2)
cmake文件中有什么問題?
如評論中所述,應為target_include_directories
提供目錄的路徑,而不是文件的路徑。
此外,如果你想創建一個依賴lib2
上lib1
,你應該這樣做,通過target_link_libraries
:依賴不僅是包含目錄,但也對編譯選項,定義,目標屬性...
target_sources
不適用於接口庫。 從這個答案中 ,您可以使用沒有命令的自定義目標將源關聯到目標而不影響構建過程(對於msvc,QtCreator和其他基於GUI的工具,這使得可以通過IDE訪問源; AFAIK對其他無用)構建工具)。
您的cmake可能如下所示:
add_library(lib1 INTERFACE)
target_sources(lib1 INTERFACE lib1.h)
target_include_directories(lib1 INTERFACE
"${PROJECT_SOURCE_DIR}/lib1"
)
add_library(lib2 INTERFACE)
if(MSVC)
add_custom_target(lib2.headers SOURCES lib2.h)
endif()
target_include_directories(lib2 INTERFACE
"${PROJECT_SOURCE_DIR}/lib2"
)
target_link_libraries(lib2 INTERFACE lib1)
add_executable(project main.cc)
target_link_libraries(project lib2)
高級提示:您可以在target_include_directories
為構建樹和安裝樹指定其他目錄(請參閱文檔 ):
target_include_directories(lib1 INTERFACE
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/lib1>
$<INSTALL_INTERFACE:${YOUR_INSTALL_DIR}/lib1>
)
我使用了一個空的_only_for_compiling_the_lib.cpp
文件作為最簡單和最快速的解決方法,但顯然強烈建議使用上述解決方案。
我根本不知道INTERFACE
關鍵字。
此問題是由INTERFACE庫文件的完整路徑問題引起的,該問題已在cmake 3.13版中得到修復。
欲了解更多信息: https : //gitlab.kitware.com/cmake/cmake/issues/17556
此頁面還包含一個更好理解的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.