CMake生成VS2022解决方案遇未解析项目引用问题求助
CMake生成VS2022解决方案后项目引用未解析依赖的问题排查与修复
问题根源
你的CMake配置存在两处明确错误,这是导致VS中出现Microsoft.VisualStudio.ProjectSystem.References.UnresolvedBuildDependencyProjectReference错误的核心原因,并非CMake与VS的兼容性Bug:
B项目中未定义
${Hdr}变量却在目标构建中使用
在B/CMakeLists.txt里,你执行了add_executable(${PROJECT_NAME} ${Hdr} ${Src}),但未像A项目那样通过file(GLOB_RECURSE)定义Hdr变量。CMake会将未定义变量视为空值,这会干扰VS项目系统对目标文件结构的解析,进而引发依赖引用识别异常。B项目的
target_include_directories包含无效路径
如果B目录下不存在inc文件夹,target_include_directories(${PROJECT_NAME} BEFORE PUBLIC inc PRIVATE src)中的PUBLIC inc会添加一个无效的包含路径,这也会影响VS对项目依赖关系的正确识别。
另外,子项目中重复调用project()指令虽不违反CMake语法,但会增加VS项目结构的复杂度,建议子项目仅专注于目标构建,无需重新定义项目名称(根目录的project(Test)已足够定义整个解决方案)。
修复后的配置代码
根目录CMakeLists.txt(无需修改)
cmake_minimum_required(VERSION 3.24) project(Test) add_subdirectory(A) add_subdirectory(B)
A/CMakeLists.txt(优化:移除重复的project())
cmake_minimum_required(VERSION 3.24) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) file(GLOB_RECURSE Hdr CONFIGURE_DEPENDS inc/*) file(GLOB_RECURSE Src CONFIGURE_DEPENDS src/*) add_library(A SHARED ${Hdr} ${Src}) target_include_directories(A BEFORE PUBLIC inc PRIVATE src) set_property(TARGET A APPEND PROPERTY PUBLIC_HEADER ${Hdr})
B/CMakeLists.txt(修复变量错误与无效路径)
cmake_minimum_required(VERSION 3.24) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 若B存在头文件,取消注释下方行;无则删除 # file(GLOB_RECURSE Hdr CONFIGURE_DEPENDS inc/*) file(GLOB_RECURSE Src CONFIGURE_DEPENDS src/*) # 根据是否有头文件选择对应参数 add_executable(B ${Src}) # 若有头文件则改为:add_executable(B ${Hdr} ${Src}) # 若B无inc目录则移除PUBLIC inc;有则保留 target_include_directories(B BEFORE PRIVATE src) target_link_libraries(B PRIVATE A)
验证操作
- 删除已生成的
tmp目录,重新执行CMake生成指令:
cmake.exe -S . -B tmp start tmp\Test.sln
- 打开VS2022后,检查B项目的References:此时双击A引用或查看属性,将不再出现未解析依赖错误,项目可正常编译运行。
内容的提问来源于stack exchange,提问作者Solo
相关产品推荐
相关产品推荐

