2016-02-05 47 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