【问题标题】:What is the difference between "${CMAKE_CURRENT_SOURCE_DIR}" and "." in INCLUDE_DIRECTORIES?“${CMAKE_CURRENT_SOURCE_DIR}”和“.”有什么区别?在 INCLUDE_DIRECTORIES 中?
【发布时间】:2015-06-08 09:16:00
【问题描述】:

我应该使用

INCLUDE_DIRECTORIES(
    .
)

INCLUDE_DIRECTORIES(
    ${CMAKE_CURRENT_SOURCE_DIR}
)

有什么区别,如果有的话?我看到的大多是“。”在现有代码中,但是在互联网上搜索一个点有点困难......

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

    在这里,您选择哪一个是一个品味问题。

    【讨论】:

      【解决方案2】:

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

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

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

      • 通常它应该包含生成器表达式
      • 在 Windows 上不是的所有内容都以\/ 开头,第二个字符不是:
      • 在 Unix 上所有/~ 开头的东西

      因此下面的 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 生成器)。

      一些额外的参考资料:

      【讨论】:

        猜你喜欢
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        相关资源
        最近更新 更多