【问题标题】:Referencing Visual studio variables from cmake从 cmake 引用 Visual Studio 变量
【发布时间】:2016-02-05 19:33:17
【问题描述】:

我正在使用 cmake 生成一个 Visual c++ 项目,我想在我的包含路径中添加一个 Visual Studio 变量。

对于带有硬编码路径的普通变量,我可以简单地做 include_directories(PathToFolderIWantToInclude)

但是现在我想用一个已经知道的可变视觉工作室做同样的事情。 $(KIT_SHARED_IncludePath)

我试着简单地做 include_directories($(KIT_SHARED_IncludePath))

但是,这会产生 c:\path\to\my\project\$(KIT_SHARED_IncludePath)。我还尝试将值存储在变量中并使用该变量代替,但这也不起作用。如何防止 cmake 将当前路径添加到包含路径中?

【问题讨论】:

    标签: visual-studio cmake


    【解决方案1】:

    问题是 CMake 没有直接的方法来传递 include_directories 中的相对路径,并且没有预先添加 CMAKE_CURRENT_SOURCE_DIR 变量的值(将其设置为无也无济于事)。但是考虑到 VS 宏扩展到绝对路径,我们可以尝试通过提供如下 VS 宏来绕过 cmake 守卫:

    include_directories("\\\\?\\$(KIT_SHARED_IncludePath)")
    

    它可以解决问题,因为它肯定是一个绝对路径,并且正确的路径将作为附加包含路径添加到编译器。唉,2016年的MS工具,即MSVC编译器,不知道如何处理MS多年前引入的路径。因此,这种做事方式适用于生活在更好时代的人们,因为 MSVC 知道如何处理扩展长度的路径。

    但我们还没有完成。我们还有另一种方法可以规避这种矛盾的 CMake 行为:我们可以使用generator expressions。我们可以使用的位于列表顶部:

    include_directories($<1:$(KIT_SHARED_IncludePath)>)
    

    这样 CMake 就没有机会并且必须遵守 - 正确的行被添加到附加包含的列表中。但它有一个副作用:CMake 开始抱怨(给出警告,而不是错误)include_directories 命令中的相对路径,您可以使用以下命令关闭它:

    cmake_policy(SET CMP0021 OLD)
    

    或者每次使用以下参数运行 cmake:-Wno-dev。但后者将禁用所有警告,因此我认为在这种情况下第一个选项更可取。


    UPD:找到了更简单的方法来实现同样的目标。只需将以下行添加到您的 cmake 文件中:

    add_definitions(-I$(KIT_SHARED_IncludePath))
    

    【讨论】:

    • 好主意,我一直在尝试使用 include_directories 但 add_definition 也可以。谢谢!
    • 我只想补充一点,最近我必须包含 Windows DIA SDK。因为他们在文件夹名称中有一个空格(为什么??)这个add_definitions技巧工作得很好:add_definitions(-I$(VsInstallDir)/"DIA SDK"/include)
    【解决方案2】:

    CMake 不支持对构建环境的内部变量的引用。

    它实际上想要完整的信息关于项目在配置阶段(cmake调用产生.sln)。例外仅适用于功能,可通过使用generator-expressions 访问:它们允许推迟一些决策以构建步骤(构建项目)。但是这个功能非常有限。

    您最好猜测所需包含路径的值。它通常看起来像C:\Program Files (x86)\Windows Kits\10\Include\&lt;KitVersion&gt;\shared

    例如,您可以使用带有适当提示的命令find_path。并通过命令include_directories 使用结果变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      相关资源
      最近更新 更多