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