目錄
一、問題背景
二、問題分析
三、問題解決
一、問題背景
? ? ? ?VS2022中能夠跨平臺的工程類型就是CMake項目,一套代碼能跨windows/Linux/Mac多種操作系統(tǒng)。而實際使用時,發(fā)現(xiàn)相關(guān)資料比較少,需要摸索一下。
?碰到的問題簡述:
?文章來源地址http://www.zghlxwxcb.cn/news/detail-654773.html
1、C++?Intellisense信息可能過時,生成要刷新的CMake緩存。
2、多次定義了變量 CMAKE_INSTALL_PREFIX
3、CMake Error: CMake was unable to find a build program corresponding to "Ninja". ?CMAKE_MAKE_PROGRAM is not set. ?You probably need to select a different build tool.? 4、CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage????
5、CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage?? ? ? ??
?二、問題分析
CMake工程中最重要的文件就是CMakeLists文件,其包含工程所有需要的元素,例如下面這個demo。直接用CMakeLists會覺得難用;但用了makefile再用這個就覺得CMakeLists十分友好了。
# CMakeList.txt: CMakeProject1 的 CMake 項目,在此處包括源代碼并定義
# 項目特定的邏輯。
#
cmake_minimum_required (VERSION 3.8)
# 如果支持,請為 MSVC 編譯器啟用熱重載。
if (POLICY CMP0141)
cmake_policy(SET CMP0141 NEW)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>")
endif()
project ("CMakeProject1")
# 將源代碼添加到此項目的可執(zhí)行文件。
add_executable (CMakeProject1 "CMakeProject1.cpp" "CMakeProject1.h")
if (CMAKE_VERSION VERSION_GREATER 3.12)
set_property(TARGET CMakeProject1 PROPERTY CXX_STANDARD 20)
endif()
# TODO: 如有需要,請?zhí)砑訙y試并安裝目標(biāo)。
如果上面的demo看不懂,建議先惡補一下,不然下面的內(nèi)容會比較吃力。
VS創(chuàng)建CMake工程時,默認會創(chuàng)建一個CMakePresets.json文件。
?例如本地計算機的x64-Debug工程屬性由下面的json片段來描述。這個片段把CMake要用的c/c++編譯器進行了定義(cl.exe)。
{
"name": "windows-base",
"hidden": true,
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"installDir": "${sourceDir}/out/install/${presetName}",
"cacheVariables": {
"CMAKE_C_COMPILER": "cl.exe",
"CMAKE_CXX_COMPILER": "cl.exe"
},
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
}
},
{
"name": "x64-debug",
"displayName": "x64 Debug",
"inherits": "windows-base",
"architecture": {
"value": "x64",
"strategy": "external"
},
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
}
然而,這個json文件對于linux和mac的描述則不完整,以下為linux-debug工程屬性,其中對c/c++編譯器沒有定義。
{
"name": "linux-debug",
"displayName": "Linux Debug",
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"installDir": "${sourceDir}/out/install/${presetName}",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
},
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
},
"vendor": {
"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {
"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"
}
}
}
這就是把本地計算機工程改為遠程Linux工程時,vs報錯的原因了。猜想vs的開發(fā)工程師在做這個功能時,只針對本地window環(huán)境編寫了完整的CMakePresets.json,而針對其他平臺只寫了一段參考,其實現(xiàn)并不完整,需要用戶手動配置缺失部分。例如,配置Linux系統(tǒng)中CMake用到的c/c++編譯器,Ninjia路徑等。可以參考一下官方的文檔
使用 CMake 預(yù)設(shè)進行配置和生成 | Microsoft Learn
三、問題解決
有了第二部分的分析,解決問題的思路就有了,把相關(guān)的配置補充完整。
首先,補充c/c++編譯器,linux機器上已經(jīng)裝了gcc/g++,直接填好就可以了。
(如果沒有安裝需要在linux安裝一下 apt install gcc g++)
{
"name": "linux-debug",
"displayName": "Linux Debug",
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"installDir": "${sourceDir}/out/install/${presetName}",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_C_COMPILER": "gcc",
"CMAKE_CXX_COMPILER": "g++"
}
改了以后,這兩個報錯沒有了。
4、CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage????
5、CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage??
?上面的錯誤顯示查詢ninja版本號時失敗了。裝一個ninja:
sudo apt install ninja-build
安裝完成后,回到vs中,按ctrl+S,保存工程時,會自動再次構(gòu)建工程,發(fā)現(xiàn)構(gòu)建成功。
最后,雖然構(gòu)建成功了,實際上有個錯誤最后還是沒有解決,即使它不影響工程的構(gòu)建結(jié)果。
多次定義了變量 CMAKE_INSTALL_PREFIX
從構(gòu)建日志看出,CMAKE_INSTALL_PREFIX,確實定義了兩次。感覺這就是vs的一個bug,有博友知道如何解決,請評論告知,十分感謝。
/usr/bin/cmake -G "Ninja" ? -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_C_COMPILER:STRING="gcc" -DCMAKE_CXX_COMPILER:STRING="g++" -DCMAKE_INSTALL_PREFIX:PATH="/root/.vs/CMakeProject1/out/install/linux-debug" ? -DCMAKE_INSTALL_PREFIX:PATH="/root/.vs/CMakeProject1/out/install/linux-debug" ?/root/.vs/CMakeProject1/CMakeLists.txt文章來源:http://www.zghlxwxcb.cn/news/detail-654773.html
?
到了這里,關(guān)于VS2022 CMake報錯解決小結(jié)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!