Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从find-xxx.cmake文件返回多个include目录_Cmake - Fatal编程技术网

从find-xxx.cmake文件返回多个include目录

从find-xxx.cmake文件返回多个include目录,cmake,Cmake,我正在尝试将自定义find-xxx.cmake文件添加到我的cmake项目中,以便添加外部库。外部项目不仅对链接器,而且对预编译器都有一些可传递的依赖项。也就是说,我需要为protobuf和occi以及六个其他小型库提供标题,以便包含外部项目的标题 find-extlib.cmake的相关部分: function(MY_FIND_INCLUDE LIBNAME FILENAME SUFFIX) find_path(${LIBNAME}_INCLUDE_DIR NAMES ${FILENA

我正在尝试将自定义find-xxx.cmake文件添加到我的cmake项目中,以便添加外部库。外部项目不仅对链接器,而且对预编译器都有一些可传递的依赖项。也就是说,我需要为protobuf和occi以及六个其他小型库提供标题,以便包含外部项目的标题

find-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.
这将返回一个漂亮的列表,其中包含我需要添加的所有include路径。它看起来就像我的图书馆列表,我以一种非常相似的方式制作的,而且似乎很有效

在我的
CMakeLists.txt
中,我添加了:

target_include_directories(${PROJECT_NAME} PRIVATE ${EXTLIB_INCLUDE_DIRS})
生成失败,抱怨在
LIB1
(或
LIB2
)中找不到头。我可以在我的Linux版本的
MYLIB.dir/flags.make
中看到列表没有被分解。旗帜应在哪里:

而是列出

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

这真的是正确的行为吗?我不应该为一个项目提供多个包含目录吗?如果我必须单独找到所有这些库,那将是非常乏味的。它们每次都与此外部库具有相同的配置。很难说Kitware到底打算怎么做这件事。。。是否有其他方法可以编写我的查找模块?

看起来我可以使用
连接目录list(APPEND…)
,而不是空格,或者更好一点:


分别引用每个include目录

而不是:
set(EXTLIB\u INCLUDE\u DIRS“${EXTLIB\u INCLUDE\u DIRS}${LIB2\u INCLUDE\u DIR}”)

写:
set(EXTLIB\u INCLUDE\u DIRS“${EXTLIB\u INCLUDE\u DIRS}”“${LIB2\u INCLUDE\u DIR}”)


使用双引号,您可以在字符串中包含空格。

使用
list(APPEND…)
可以让意图更加清晰。谢谢!回想起来是有道理的。我将坚持我的答案中的列表语法,正如你所说的,它更清晰。只是补充一下,现在我对cmake有了更多的了解,通过添加找到的库作为导入目标,一个自定义查找模块得到了改进。该页面包含指向所有相关文档的点,不过如果能看到一篇解释得更清楚的博客文章就好了。
-I "path/to/lib1 path/to/lib2 ..."
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 ()