2017-05-05 65 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 ...)竖起大拇指使意图更清晰。 –

相关问题