"$ {CMAKE_CURRENT_SOURCE_DIR}"和"."之间的区别是什么?在INCLUDE_DIRECTORIES?

Jen*_*ler 6 cmake

我应该用吗?

INCLUDE_DIRECTORIES(
    .
)
Run Code Online (Sandbox Code Playgroud)

要么

INCLUDE_DIRECTORIES(
    ${CMAKE_CURRENT_SOURCE_DIR}
)
Run Code Online (Sandbox Code Playgroud)

有什么区别,如果有的话?我见过大多数"." 在现有代码中,但在互联网上搜索点有点困难......

Rud*_*udi 6

这两种用法都会生成几乎相同的输出,因为CMake跟踪当前目录并替换"."的出现."$ {CMAKE_CURRENT_SOURCE_DIR} /.".唯一的区别是"." variant具有额外的路径组件"/".追加.

无论你选择哪一个都是品味问题.


Flo*_*ian 2

在您的情况下,您可以考虑将CMAKE_INCLUDE_CURRENT_DIR全局设置为ON

关于你的问题,答案主要取决于你自己的喜好。为了文件的可读性,我更喜欢相对路径变体CMakeLists.txt

如果您在cmTargetIncludeDirectoriesCommand ::Join()SystemTools::FileIsFullPath()处查看 CMake 的源代码,您会发现 CMake 检查以下条件 - 在展开变量之后 - 是否会将其附加CMAKE_CURRENT_SOURCE_DIR到包含路径:

  • 一般来说它应该包含生成器表达式
  • 在 Windows 上,所有\以or开头/且第二个字符不是:
  • 在 Unix 上,所有/以or开头的内容~

结果是以下 CMake 代码

include_directories(.)
get_directory_property(_inc_dirs INCLUDE_DIRECTORIES)
message("_inc_dirs: ${_inc_dirs}")
Run Code Online (Sandbox Code Playgroud)

将会呈现

_inc_dirs: [...your CMakeLists.txt path ...]/.
Run Code Online (Sandbox Code Playgroud)

CMake 的这种自动和绝对路径前缀行为是有意义的,因为可以(并且经常推荐)在 CMake 中进行源外树构建(另请参阅 CMake策略 CMP0021)。

您可以考虑设置CMAKE_USE_RELATIVE_PATHS,它将ON在构建环境生成期间将包含路径转换回相对于您的CMAKE_BINARY_DIR目录的路径(但它仅适用于 Makefile 生成器)。

一些额外的参考: