2016-10-06 60 views
4

我有以下文件結構的項目:如何創建一個僅依賴於外部頭文件的cmake標題庫?

project 
| 
|-------> lib1 
|   |----> lib1.h 
| 
|-------> lib2 
|   |----> lib2.h 
| 
|-------> main.cc 

兩個庫lib1lib2只包含頭文件,而lib2.h包括lib1.hmain.cc包括lib2.h

現在該如何編寫這個項目的cmake文件?我試圖爲lib2創建interface library,但編譯器無法找到lib1.h。下面是我的cmake文件的內容:

的CMakeLists.txt爲LIB2:

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文件?

+0

難道你不能只在'add_executable'中列出你的頭文件,並刪除所有'add_library'? – arrowd

+0

有一件事在源代碼中看起來很奇怪,它可以解釋這個問題:'target_include_directories()'僅適用於包含頭文件的目錄。所以它應該是'target_include_directories(lib2 INTERFACE ../ lib1)'。 – Florian

+0

感謝您的所有意見! –

回答

4

正如在評論中指出的,target_include_directories應該給一個目錄的路徑,而不是一個文件。

而且,如果你想在lib1創建lib2的依賴,你應該這樣做,通過target_link_libraries:依賴不僅是包含目錄,但也對編譯選項,定義,目標屬性...

target_sources不適用於接口庫。從this answer,您可以使用不帶命令的自定義目標在不影響構建過程的情況下將源與目標相關聯(對於msvc,這使源可通過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 lib1) 

add_executable(project main.cc) 
target_link_libraries(project lib2) 

高級提示:您可以在target_include_directories指定不同的目錄爲構建樹,安裝樹(見documentation):

target_include_directories(lib1 INTERFACE 
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/lib1> 
    $<INSTALL_INTERFACE:${YOUR_INSTALL_DIR}/lib1> 
) 
+0

感謝您的解決方案和提示! –

+1

'target_sources'不應該被需要,因爲target的類型是「INTERFACE」,並且不是自己編譯的。直接將源代碼傳遞給'add_library'甚至會出現以下錯誤:'add_library INTERFACE庫不需要源參數。' – helmesjo

+0

@helmesjo你是對的,我編輯了我的答案 – wasthishelpful

0

我已經使用了空的_only_for_compiling_the_lib.cpp文件作爲最簡單和最快速的解決方法,但顯然上面的解決方案強烈建議。我只是不知道INTERFACE關鍵字。

相關問題