1.问题介绍
我正在尝试创建一个MacOS应用程序,使用Windows上的Visual Studio 2022(最新版本17.2.0)和CMake模板在C++中打印“Hello World”,以便我可以远程连接(使用SSH)到MacOS,我一直在关注this official Microsoft tutorial
1.出现问题
问题是,当我在MacOS中进行CMake的安装步骤时,我无法让它识别安装的MacOS版本,因为当我在Windows中打开项目时,我在控制台中收到以下消息:
1> Copying files to the remote machine.
1> Starting copying files to remote machine.
1> Finished copying files (elapsed time 00h:00m:00s:650ms).
1> CMake generation started for configuration: 'macos-debug'.
1> Found cmake executable at /Users/maria/.vs/cmake/bin/cmake.
1> The remote system does not have CMake 3.8 or greater. An infobar to automatically deploy CMake to the remote system will be displayed if you are building on a supported architecture. See https://aka.ms/linuxcmakeconfig for more info.
它还显示上面的以下消息:
Supported CMake version is not present on 'remote address'. Install latest CMake binaries from CMake.org? Yes No
当我按“是”时,它说我实际上在远程MacOS上安装了cmake:
1> Copying files to the remote machine.
1> Starting copying files to remote machine.
1> Finished copying files (elapsed time 00h:00m:00s:650ms).
1> CMake generation started for configuration: 'macos-debug'.
1> Found cmake executable at /Users/maria/.vs/cmake/bin/cmake.
1> The remote system does not have CMake 3.8 or greater. An infobar to automatically deploy CMake to the remote system will be displayed if you are building on a supported architecture. See https://aka.ms/linuxcmakeconfig for more info.
CMake binary deployment to the remote machine started. CMake generation will continue automatically after deployment finishes.
CMake binary deployment to the remote machine failed: Installation directory '/Users/maria/.vs/cmake' already exists.
1.解决方案尝试
我尝试使用brew(最新版本3.23.1)安装CMake,并确保可以直接从MacOS终端(包含在PATH中)访问cmake,我还尝试通过将“CMake.app”复制到“/Applications”并使用以下命令将其添加到路径来安装image .dmg,从而执行the official guide之后的过程:export PATH=/Applications/CMake.app/Contents/bin:$PATH
我甚至尝试安装旧版本的CMake(如3.8.0或3.8.1),但同样的事情仍然发生。预期结果与此处显示的Microsoft指南相同:
1> Copying files to the remote machine.
1> Starting copying files to remote machine.
1> Finished copying files (elapsed time 00h:00m:00s:650ms).
1> CMake generation started for configuration: 'macos-debug'.
1> Found cmake executable at /Applications/CMake.app/Contents/bin/cmake.
1> /Applications/CMake.app/Contents/bin/cmake -G "Ninja" DCMAKE_BUILD_TYPE_STRING="Debug" -DCMAKE_INSTALL_PREFIX
1> [CMake] -- Configuring done
1> [CMake] -- Generating done
1> [CMake] -- Build files have been written to: /Users/cti/.vs/CMakeProject90/out/build/macos-debug
1> Extracted CMake variables.
1> Extracted source files and headers.
1> Extracted code model.
1> Extracted includes paths.
1> CMake generation finished.
有谁知道为什么会发生这种情况,或者有什么办法可以解决这个问题?
3条答案
按热度按时间r8xiu3jd1#
这似乎是Visual Studio的一个bug。你可以跟踪它here。
解决方案
看起来Visual Studio总是在当前通过SSH连接的用户的本地文件夹下查找CMake(即
~/.vs/cmake/bin/cmake
),不管你是如何安装的。然后,当Visual Studio建议安装它时:“192.168.1.180”上不存在支持的CMake版本。从www.example.com安装最新的CMake二进制文件CMake.org?
如果你同意这样做,它实际上推出它在本地的文件夹。Visual Studio使用的二进制文件已损坏,如果您尝试在Mac计算机上本地使用它,则会引发错误:
这就是为什么Visual Studio一直在努力寻找工作的CMake二进制文件。您可以通过创建一个符号链接到包含工作CMake二进制文件的文件夹来代替Visual Studio在其中查找它们的文件夹:
此时,Visual Studio将能够定位CMake,但无法定位默认编译器和生成器:
解决这个问题的最简单方法就是在Mac机器上运行这个命令。它将生成Visual Studio可以使用该高速缓存,但是请注意,无论何时此缓存因任何原因而无效(例如在配置之间切换时),您必须以相同的方式重新生成它。另一种选择是显式指定所有缺少的参数(通过CMakeLists.txt或作为CMakePresets.json的
cacheVariables
属性下的命令行参数)5kgi1eie2#
我终于解决了这个问题,我不得不复制位于CMake应用程序中的文件:
/Applications/CMake.app/Contents/bin/cmake
到Visual Studio试图找到它们的位置,在我的例子中是:/Users/maria/.vs/cmake/bin/cmake
这个版本不是问题,因为我用最新的CMake版本(3. 23. 1)试过了,效果很好。最后,我发现了一个问题,与C++和C for CMake的编译器的位置以及Ninja的位置缺乏指示有关,我只是在
CMakePresets.json
中指定了它,我没有遇到大问题:我希望有人会发现这是一个有用的解决方案时,在MacOS上开发与Visual Studio(在Windows上)
7rtdyuoh3#
我认为这是Visual Studio的一个bug。在Visual Studio中打开Tool菜单,然后打开Options-Cross-Platform-Logging and Diagnostics,选中Startup Logging and Log进入输出窗口中的跨平台日志空间。
Here is a screenshot
然后重新生成,切换到跨平台日志记录,您将看到visual studio如何查找cmake。使用
realpath -m -L cmake
和readlink -f -m cmake
命令。此命令的参数可以在Linux上工作,但在macOS上是错误的。另外,which cmake
命令直接在macOS终端中运行也是正确的,但是Visual Studio得到了一个错误的值1,我认为这是Visual Studio的一个bug。Log screenshot
Terminal execution command screenshot