首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从find-xxx.cmake文件返回多个包含目录

从find-xxx.cmake文件返回多个包含目录
EN

Stack Overflow用户
提问于 2017-05-05 12:51:05
回答 2查看 1.3K关注 0票数 2

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

查找-extlib.cmake的相关部分:

代码语言:javascript
运行
复制
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中,我添加:

代码语言:javascript
运行
复制
target_include_directories(${PROJECT_NAME} PRIVATE ${EXTLIB_INCLUDE_DIRS})

构建失败,抱怨在LIB1 (或LIB2等)中找不到标头。我可以在我的Linux构建的MYLIB.dir/flags.make中看到列表没有被分解。旗帜应在何处:

代码语言:javascript
运行
复制
-I path/to/lib1 -I path/to/lib2 ...

而是列出了

代码语言:javascript
运行
复制
-I "path/to/lib1 path/to/lib2 ..."

这行为真的正确吗?难道我不能为一个项目提供多个包含目录吗?如果我必须单独找到所有这些库,那就太乏味了。它们每次都使用这个外部库进行相同的配置。很难知道Kitware到底打算怎么做.我应该用不同的方式来写我的查找模块吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-05 13:51:09

分别引用每个包含目录。

而不是:set(EXTLIB_INCLUDE_DIRS "${EXTLIB_INCLUDE_DIRS} ${LIB2_INCLUDE_DIR}")

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

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

票数 3
EN

Stack Overflow用户

发布于 2017-05-05 13:50:57

看起来,我可以使用;而不是空格连接目录,或者使用list(APPEND ...)来连接更好的目录。

代码语言:javascript
运行
复制
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 ()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43805466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档