cmake的CMAKE_CONFIGURATIO_TYPES 變量與 ZERO_CHEK項目編譯失敗 問題

最近學習DynamoRIO 的時候,想手動編譯一下該項目自帶的例子,結果卻總是報錯
我的編譯方式類似與下面這種

cmake -G "Visual Studio 15 2017 Win64"   ..  -DDynamoRIO_DIR=/我的參數/   
cmake  --build  . --config Release

然後就會報錯:

“C:\Users\Mr\Documents\WIN_AFI\test\DynamoRIO-Windows-7.0.17873-0\samples\build\ALL_BUILD.vcxproj”(默認目標) (1) ->
“C:\Users\Mr\Documents\WIN_AFI\test\DynamoRIO-Windows-7.0.17873-0\samples\build\ZERO_CHECK.vcxproj”(默認目標) (2) ->
(PlatformPrepareForBuild 目標) ->
  C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\Microsoft.Cpp.Platform.targets(65,5):
error MSB8020: 無法找到 Visual Studio 2010 的生成工具(平臺工具集 =“v100”)。若要使用 v100 生成工具進行生成,請安裝 Visual Studio 2010 生成工具。或者,可以升級到當前 Visual Studi
o 工具,方式是通過選擇“項目”菜單或右鍵單擊該解決方案,然後選擇“重定解決方案目標”。 [C:\Users\Mr.wang\Documents\WIN_AFI\test\DynamoRIO-Windows-7.0.17873-0\samples\build\
ZERO_CHECK.vcxproj]

報錯裏面提示ZERO_CHECK 項目編譯失敗,原因是無法找到 vs 2010 的生成工具。
然而我明明在命令裏面確定編譯工具是 vs 2017 了,爲什麼會使用不存在的vs 2010 編譯呢?

這裏我提醒一下,ZERO_CHECK 是一個cmake 自動生成的項目,使用cmake生成項目的構建信息時,一共會生成三個項目: ALL_BUILD 、目標項目、ZERO_CHECK .

那麼原因到底在那裏呢?google 了一下,找到了一種解決方法 ,把第二條命令修改爲:

 cmake  --build  . --config  RelWithDebInfo

RelWithDebInfo 是什麼,類似與Debug, Release ,是四種編譯模式中的一種。
這時候我就奇怪了,爲什麼修改一下編譯方式就成功了?

根據我的瞭解,編譯方式應該是由CMakeLists.txt 文件裏的CMAKE_CONFIGURATION_TYPES 變量控制的,看一下這個項目的 CMakeLists.txt 文件,果然在文件開頭處有關於CMAKE_CONFIGURATION_TYPES 的配置。

然後我使用 cmake_print_variables(CMAKE_CONFIGURATION_TYPES) 打印了一下這個變量,果然被定義爲“RelWithDebInfo”
而一般的項目這個變量默認應該是:“Debug;Release;MinSizeRel;RelWithDebInfo”,也就是說四種編譯方式都可以使用。

對比之下我們就知道了爲什麼DynamoRIo 只能使用 RelWithDebInfo 的編譯方式了。
那麼修改一下這個變量,我們就可以使用任意一種編譯方式了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章