2017-05-05 60 views
0

我試圖添加一個自定義find-xxx.cmake文件到我的cmake項目中以添加一個外部庫。外部項目不僅對鏈接器有一些傳遞依賴關係,對於預編譯器也有一些傳遞依賴關係。即我需要爲protobuf和occi以及其他六個小型庫提供標題,以包含外部項目的標題。從find-xxx.cmake文件返回多個包含目錄

發現,extlib.cmake的相關部分:

function(MY_FIND_INCLUDE LIBNAME FILENAME SUFFIX) 
find_path(${LIBNAME}_INCLUDE_DIR 
    NAMES ${FILENAME} 
    PATHS ${EXTLIB_POSSIBLE_DIRS} 
    PATH_SUFFIXES ${SUFFIX} 
    ) 

if (${LIBNAME}_INCLUDE_DIR) 
    MESSAGE_QUIETLY(EXTLIB_FIND_QUIETLY STATUS "Found ${${LIBNAME}_INCLUDE_DIR}") 
elseif (EXTLIB_FIND_REQUIRED) 
    message(FATAL_ERROR "Could not find extlib.") 
else() 
    MESSAGE_QUIETLY(EXTLIB_FIND_QUIETLY WARNING "${LIBNAME} headers not found") 
endif() 

mark_as_advanced(${LIBNAME}_INCLUDE_DIR) 
endfunction() 

MY_FIND_INCLUDE(LIB1 header.h main/lib1) 
if (LIB1_INCLUDE_DIR) 
    set(EXTLIB_INCLUDE_DIRS ${LIB1_INCLUDE_DIR}) 
endif() 
MY_FIND_INCLUDE(LIB2 lib2/lib2.h include) 
if (LIB2_INCLUDE_DIR) 
    set(EXTLIB_INCLUDE_DIRS "${EXTLIB_INCLUDE_DIRS} ${LIB2_INCLUDE_DIR}") 
endif() 
# etc, etc. 

這將返回我需要添加所有包含路徑的一個非常漂亮的列表。它看起來就像我的圖書館清單,我以一種非常相似的方式製作,而且似乎很有用。

在我CMakeLists.txt,我補充一下:

target_include_directories(${PROJECT_NAME} PRIVATE ${EXTLIB_INCLUDE_DIRS}) 

構建失敗,抱怨無法找到標題中LIB1(或LIB2等)。在我的Linux版本中,我可以在MYLIB.dir/flags.make中看到列表未被分解。當國旗應該是:

-I path/to/lib1 -I path/to/lib2 ... 

它,而不是列出

-I "path/to/lib1 path/to/lib2 ..." 

這真的是正確的行爲?我不應該能夠爲單個項目提供多個包含目錄嗎?如果我必須單獨找到所有這些庫,那將過於乏味。它們每次都會與此外部庫進行相同的配置。我們很難說出Kitware是如何實現這個目標的......我是否有另外一種方式來編寫我的查找模塊?

+0

只需添加,現在我已經多了一點cmake的知識,通過添加找到的庫作爲導入目標來改進自定義查找模塊。 [This](https://cmake.org/cmake/help/v3.4/manual/cmake-packages.7.html#find-module-packages)頁面包含所有相關文檔的內容,儘管它會是很高興看到一篇更清晰解釋事物的博客文章。 – chadsgilbert

回答

2

報價各自獨立include目錄。

相反的: set(EXTLIB_INCLUDE_DIRS "${EXTLIB_INCLUDE_DIRS} ${LIB2_INCLUDE_DIR}")

寫: set(EXTLIB_INCLUDE_DIRS "${EXTLIB_INCLUDE_DIRS}" "${LIB2_INCLUDE_DIR}")

用雙引號,你包括字符串中的空白。

+0

謝謝!現在回想起來。正如你所說,我會堅持在我的答案中的列表語法,它有點更清晰。 – chadsgilbert

2

它看起來像我可以使用一個;而不是空間,或者更好一點,使用list(APPEND ...)串連的目錄:

MY_FIND_INCLUDE(LIB1 header.h main/lib1) 
if (LIB1_INCLUDE_DIR) 
    list(APPEND EXTLIB_INCLUDE_DIRS ${LIB1_INCLUDE_DIR}) 
endif() 
MY_FIND_INCLUDE(LIB2 lib2/lib2.h include) 
if (LIB2_INCLUDE_DIR) 
    list(APPEND EXTLIB_INCLUDE_DIRS "${LIB2_INCLUDE_DIR}") 
endif() 
+0

使用'list(APPEND ...)豎起大拇指使意圖更清晰。 –

相關問題