Cmake,在foreach()循环中包含_目录';行不通

Cmake,在foreach()循环中包含_目录';行不通,cmake,Cmake,cmake 3.5 我在我的CMake项目中尝试了以下代码。 假设SUBDIRS包含一个目录列表: 一, 二, 三, 上述源代码均无效。 看起来我必须明确声明每个路径: include_directories(path/to/dir1 path/to/dir2 ...) 我注意到了 include_directories("path/to/dir1" "path/to/dir2") 与之相反,它也能起作用 inc

cmake 3.5

我在我的CMake项目中尝试了以下代码。 假设
SUBDIRS
包含一个目录列表:

一,

二,

三,

上述源代码均无效。
看起来我必须明确声明每个路径:

include_directories(path/to/dir1
                    path/to/dir2
                    ...)
我注意到了

include_directories("path/to/dir1" "path/to/dir2")
与之相反,它也能起作用

include_directories("path/to/dir1 path/to/dir2")
这不管用。我认为这反映了
foreach()
问题

有什么建议吗? 谢谢

-----------编辑------------
来自
1.
消息(状态“include dir”${subdir})
的消息提供以下输出:

including dir path/to/dir1
including dir path/to/dir2

您的第一个代码片段在我看来很不错,我在不久前编写的一个项目中检查了一些CMake代码,它看起来几乎相同

foreach(subdir ${SUBDIRS})
    if(IS_DIRECTORY ${subdir})
        MESSAGE( STATUS "Including dir " ${subdir} )
        include_directories(${subdir})
    endif()
endforeach()
我最好的猜测是您设置的SUBDIRS变量不正确

试着做一些类似的事情:

set(SUBDIRS
    path/to/dir1
    path/to/dir2
)

然后看看循环是否有效。如果是这样,可能是变量值的问题。尽管可以引用列表中的单个条目,但请确保不要在您设置细分的值列表周围加引号。

您所说的“不起作用”是什么意思?你期待什么,会发生什么。很明显,
include\u目录(“path/to/dir1 path/to/dir2”)
是错误的,因为您只传递了一个参数,它不是一个有效的路径。除了在
include\u directories()
指令之后要包含的所有目录之外,请给出要添加的实际路径。它们是否包含空格?您得到了什么输出?如何测试
include\u directories
命令是否有效工作?另外,有人提到你应该给出完整的路径,例如,
“${CMAKE\u SOURCE\u DIR}/path/to/dir1”
。在第一个示例中,最后一件要尝试的事情是添加引号,如下面的
include_目录(${subdir}”)
您可以尝试添加另一个
message()
调用,该调用位于循环内部,但位于
if(is_目录)
部分之外。这将让您知道循环是否正常工作。我最好的猜测是
子目录中的目录路径不正确。您可能希望相对于当前cmake目录指定它们。例如,我同意贾斯汀·布坎南的观点,这应该是可行的,而不是
path/to/dir1
,而是
${CMAKE\u CURRENT\u SOURCE\u DIR}/path/to/dir1
@hudac。您必须将
${CMAKE\u CURRENT\u SOURCE\u DIR}
添加到填写
子目录的位置。另请参阅,您可以使用
get_directory\u属性(_inc_dirs INCLUDE_DIRECTORIES)
message(“_inc_dirs:${u inc_dirs}”)
检查实际设置的内容。如果您不确定在for\u之前是否正确设置了变量,请尝试使用命令消息打印值(状态${VAR\u NAME})。
including dir path/to/dir1
including dir path/to/dir2
foreach(subdir ${SUBDIRS})
    if(IS_DIRECTORY ${subdir})
        MESSAGE( STATUS "Including dir " ${subdir} )
        include_directories(${subdir})
    endif()
endforeach()
set(SUBDIRS
    path/to/dir1
    path/to/dir2
)