【发布时间】:2015-06-08 09:16:00
【问题描述】:
我应该使用
INCLUDE_DIRECTORIES(
.
)
或
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}
)
有什么区别,如果有的话?我看到的大多是“。”在现有代码中,但是在互联网上搜索一个点有点困难......
【问题讨论】:
标签: cmake
我应该使用
INCLUDE_DIRECTORIES(
.
)
或
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}
)
有什么区别,如果有的话?我看到的大多是“。”在现有代码中,但是在互联网上搜索一个点有点困难......
【问题讨论】:
标签: cmake
两种用法生成几乎相同的输出,因为 CMake 会跟踪当前目录并替换“.”的出现。与“${CMAKE_CURRENT_SOURCE_DIR}/.”。唯一的区别是“。”变体具有额外的路径组件“/.”附加。
在这里,您选择哪一个是一个品味问题。
【讨论】:
在您的情况下,您可以考虑将CMAKE_INCLUDE_CURRENT_DIR 全局设置为ON。
关于您的问题,答案主要取决于您自己的喜好。为了CMakeLists.txt 文件的可读性,我更喜欢相对路径变体。
如果您在 cmTargetIncludeDirectoriesCommand
::Join() 和 SystemTools::FileIsFullPath() 查看 CMake 的源代码,您会发现 CMake 检查了以下条件 - 在扩展变量之后 - 如果它将 CMAKE_CURRENT_SOURCE_DIR 附加到包含路径:
\ 或/ 开头,第二个字符不是:
/ 或~ 开头的东西
因此下面的 CMake 代码
include_directories(.)
get_directory_property(_inc_dirs INCLUDE_DIRECTORIES)
message("_inc_dirs: ${_inc_dirs}")
会显示
_inc_dirs: [...your CMakeLists.txt path ...]/.
CMake 的这种自动和绝对路径前缀行为是有意义的,因为它可以 - 并且经常被推荐 - 在 CMake 中进行源外树构建(另请参阅 CMake policy CMP0021)。
您可以考虑将 CMAKE_USE_RELATIVE_PATHS 设置为 ON,这将在生成构建环境期间将包含路径转换回相对于您的 CMAKE_BINARY_DIR 目录的路径(但它仅适用于 Makefile 生成器)。
一些额外的参考资料:
【讨论】: