【问题标题】:cmake + VS = "Microsoft.VisualStudio.ProjectSystem.References.UnresolvedBuildDependencyProjectReference"cmake + VS = \"Microsoft.VisualStudio.ProjectSystem.References.UnresolvedBuildDependencyProjectReference\"
【发布时间】:2022-12-09 22:50:32
【问题描述】:

我有一个非常简单的 CMake 解决方案,其中包含一个共享库和一个可执行文件。

CMakeLists.txt:

cmake_minimum_required(VERSION 3.24)

project(Test)

add_subdirectory(A)
add_subdirectory(B)

A/CMakeLists.txt:

cmake_minimum_required(VERSION 3.24)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(A)

file(GLOB_RECURSE Hdr CONFIGURE_DEPENDS inc/*)
file(GLOB_RECURSE Src CONFIGURE_DEPENDS src/*)

add_library(${PROJECT_NAME} SHARED ${Hdr} ${Src})
target_include_directories(${PROJECT_NAME} BEFORE PUBLIC inc PRIVATE src)

set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY PUBLIC_HEADER ${Hdr})

A/CMakeLists.txt:

cmake_minimum_required(VERSION 3.24)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(B)

file(GLOB_RECURSE Src CONFIGURE_DEPENDS src/*)

add_executable(${PROJECT_NAME} ${Hdr} ${Src})
target_include_directories(${PROJECT_NAME} BEFORE PUBLIC inc PRIVATE src)
target_link_libraries(${PROJECT_NAME} PRIVATE A)

我使用所有这些来生成一个 VS2022 解决方案并打开它:

cmake.exe -S . -B tmp
start tmp\Test.sln

似乎考虑了 CMake 目标“A”,因为我在 VS 项目“B”的“附加包含目录”中看到了公共标头文件夹 (A/inc)。 当我在 VS 中导航到 B/References 时,我按预期看到了对项目“A”的引用:

但是当我双击它或尝试查看它的属性时,我得到: “Microsoft.VisualStudio.ProjectSystem.References.UnresolvedBuildDependencyProjectReference”

是否存在 CMake+VS 错误?或者我做错了什么?

注意:如果我从 Visual Studio(没有 CMake)手动创建整个解决方案,它工作正常!

【问题讨论】:

  • 这很奇怪。我有一个包含多个库(虽然是静态的)的项目,并且在 MSVS2022 中一切都按预期工作。

标签: c++ cmake reference c++20 visual-studio-2022


【解决方案1】:

我在用着CMake 3.24.1VS2019我面临着同样的问题。从我在 PC 上看到的情况,我可以得出结论,这肯定不是 CMake 问题。那是因为,在使用 CMake 生成我的 VS 解决方案之后,我可以通过简单地修改vcx项目我的解决方案中的文件。但是,还有一件事我还不明白,是什么让我怀疑 VS 有某种问题。这是我看到/做的。

我的 CMake 生成的解决方案包含一个依赖于多个静态库项目的控制台应用程序:这些项目被添加到应用程序的参考部分。现在,当我双击其中一个时,我收到以下消息:

属性窗格中引用项目的完整路径属性显示相同的消息。

为了解决这个问题,我打开控制台应用程序的 vcxproj 文件并查找以下条目:

我删除完整项目参考每个配置的元素,保存 vcxproj 文件并重新启动我的解决方案。在我的情况下,问题就解决了:不再有烦人的消息和完整路径属性解析为有效路径。但 ...

由于我删除了这个 ProjectReferences 元素链接库依赖属性现在默认为是的.我可以通过打开“属性”窗口并检查正确的字段来验证这一点。表明是的.

现在,我的案例 CMake 生成了一个解决方案,其中链接库依赖项被设置为错误的.因此,我再次打开我的控制台应用程序的属性窗格并设置链接库依赖财产回错误的.我关闭属性窗口并尝试重建我的项目:没问题。运行应用程序:没问题。

什么时候,更新后链接库依赖财产与错误的在“属性”窗格中,我保存我的项目,然后使用文本编辑器打开 vcxproj 文件,我注意到再次添加了 ProjectReferences 元素。它设置为错误的.这是预期的。但是,关闭时我重新打开解决方案最初的问题又回来了.但是,当我使用文本编辑器将 vcxproj 文件中的 ProjectReferences 属性值从 false 更改为 true 时,打开解决方案后问题就消失了!!

根据我的 VS 解决方案的经验,我得出以下结论:

  1. 我可以通过从 vcxproj 文件中删除完整的 ProjectReferences 元素(使用文本编辑器)然后重新打开解决方案来解决该问题。但随后链接库依赖属性默认为是
  2. 然后我可以改变链接库依赖属性来回为 Yes 和 No没有问题再次出现. (注意:我觉得奇怪的是,当我修改一些属性并关闭属性窗口时,vcxproj 文件没有更新。
  3. 将应用程序的项目保存到磁盘(vcxproj 文件更新)后,重新打开解决方案会再次出现问题,但前提是链接库依赖财产被保存为错误的.

    也许我忽略了一些东西,但这对我来说是一个 VS 问题。不是一个阻碍,但很烦人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-02
    • 2016-08-22
    • 2023-03-10
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多