2016-02-05 48 views
3

我正在使用cmake来生成一个visual C++项目,我想将一个visual studio变量添加到我的包含路径。从cmake引用Visual Studio变量

对于具有硬编码路径正常变量,我可以简单地做 include_directories(PathToFolderIWantToInclude)

但是现在我想要做同样的事情用一个变量的Visual Studio已经知道了。 $(KIT_SHARED_IncludePath)

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

然而国债收益率C:\路径\为\我的\项目\ $(KIT_SHARED_IncludePath)。我也尝试将值存储在一个变量中,然后使用该变量,但是这也不起作用。如何防止cmake将当前路径添加到包含路径中?

回答

4

问题是CMake没有一个直接的方法来传递include_directories中的相对路径,并且它没有预先设置变量的值(设置哪个都没有帮助)。但考虑到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)) 
+0

好主意,我被困在试图使用include_directories但add_definition的作品中。谢谢! – programit

+1

我只想补充一点,最近我不得不加入Windows DIA SDK。由于它们在文件夹名称中有一个空格(为什么?),所以'add_definitions'技巧工作得很好:'add_definitions(-I $(VsInstallDir)/“DIA SDK”/ include) – McLeary

0

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

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

您可以最好的是猜测所需包含路径的值。它通常看起来像C:\Program Files (x86)\Windows Kits\10\Include\<KitVersion>\shared

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