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
)