使用CMake与Visual Studio时生成文件未在目标视图显示的问题
VS中CMake加载项目时Protobuf生成文件不显示的问题解决
我有一个基于CMake + Protobuf构建静态库的项目,对应的CMakeLists.txt代码如下:
protobuf_generate( OUT_VAR PROTO_GENERATED_FILES PROTOS types.proto PROTOC_OUT_DIR "${CMAKE_CURRENT_LIST_DIR}/generated" ) add_library(types STATIC ${PROTO_GENERATED_FILES}) target_link_libraries(types PRIVATE protobuf::libprotobuf)
构建后生成的CPP绑定文件位置符合预期,且通过dumpbin确认库中包含对应符号,但VS打开项目的两种方式存在明显差异:
- 直接打开包含CMakePresets.json的目录,由VS自动加载配置:构建流程正常,但CMake目标视图中无法看到生成的源文件
- 先运行
cmake --preset <preset_name>生成解决方案再打开VS:生成的源文件会正常显示在types库中,可在VS内浏览编辑
这不是CMake或VS的bug,而是默认配置下VS的CMake集成对生成文件的识别需要明确的关联配置,以下两种修改方案可以解决问题:
方案1:显式标记生成文件并关联到目标
protobuf_generate( OUT_VAR PROTO_GENERATED_FILES PROTOS types.proto PROTOC_OUT_DIR "${CMAKE_CURRENT_LIST_DIR}/generated" ) # 标记生成文件为GENERATED,避免CMake在配置阶段检查文件是否存在 set_source_files_properties(${PROTO_GENERATED_FILES} PROPERTIES GENERATED TRUE) add_library(types STATIC) # 显式将生成文件关联到目标,确保VS能识别 target_sources(types PRIVATE ${PROTO_GENERATED_FILES}) target_link_libraries(types PRIVATE protobuf::libprotobuf)
方案2:使用protobuf_generate的TARGET参数直接关联
这是更简洁的方式,让protobuf_generate直接将生成的源文件绑定到目标,CMake会自动处理生成文件的跟踪逻辑:
add_library(types STATIC) protobuf_generate( TARGET types PROTOS types.proto PROTOC_OUT_DIR "${CMAKE_CURRENT_LIST_DIR}/generated" ) target_link_libraries(types PRIVATE protobuf::libprotobuf)
修改后,无论哪种方式打开VS项目,生成的Protobuf绑定文件都会正常显示在CMake目标视图中。
内容的提问来源于stack exchange,提问作者imrichardcole
相关产品推荐
相关产品推荐

