MinGW-w64 Shell中Protoc无法处理网络共享绝对路径的解决方法咨询
解决方案:通过CMake复制Proto文件到构建目录再调用protoc
针对MinGW-w64下protoc无法识别网络共享路径的问题,将proto文件单独复制到本地构建目录后再处理是可行的,既能解决路径兼容性问题,又能保持Linux/Windows跨平台编译支持,同时避免复制整个大项目。
具体CMake配置修改
替换原有的proto相关配置为以下内容:
# 保留原有的proto源路径和输出路径定义 set(PROTO_PATH ${CMAKE_CURRENT_LIST_DIR}/proto) set(PROTO_OUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/proto) # 新增:构建目录下的临时proto复制目录(本地路径,规避网络共享问题) set(PROTO_COPY_PATH ${CMAKE_CURRENT_BINARY_DIR}/proto_copy) # 定义需要处理的proto文件列表(简化原有的单个变量定义) set(PROTO_FILES ${PROTO_PATH}/PROJECT.proto ${PROTO_PATH}/entity.proto ${PROTO_PATH}/player.proto ${PROTO_PATH}/sector.proto ) # 自动生成目标pb文件列表(避免重复编写) set(PROTO_SOURCES) foreach(proto_file ${PROTO_FILES}) get_filename_component(proto_name ${proto_file} NAME_WE) list(APPEND PROTO_SOURCES ${PROTO_OUT_PATH}/${proto_name}.pb.cc ${PROTO_OUT_PATH}/${proto_name}.pb.h ) endforeach() # 步骤1:将proto文件复制到本地构建目录的临时文件夹 add_custom_command( OUTPUT ${PROTO_COPY_PATH}/.copied COMMAND ${CMAKE_COMMAND} -E make_directory ${PROTO_COPY_PATH} COMMAND ${CMAKE_COMMAND} -E copy ${PROTO_FILES} ${PROTO_COPY_PATH} COMMAND ${CMAKE_COMMAND} -E touch ${PROTO_COPY_PATH}/.copied # 生成标记文件,确保仅在源文件更新时重新复制 DEPENDS ${PROTO_FILES} ) # 步骤2:调用protoc处理复制后的本地proto文件 add_custom_command( OUTPUT ${PROTO_SOURCES} COMMAND protoc --cpp_out="${PROTO_OUT_PATH}" --proto_path="${PROTO_COPY_PATH}" ${PROTO_COPY_PATH}/PROJECT.proto COMMAND protoc --cpp_out="${PROTO_OUT_PATH}" --proto_path="${PROTO_COPY_PATH}" ${PROTO_COPY_PATH}/entity.proto COMMAND protoc --cpp_out="${PROTO_OUT_PATH}" --proto_path="${PROTO_COPY_PATH}" ${PROTO_COPY_PATH}/player.proto COMMAND protoc --cpp_out="${PROTO_OUT_PATH}" --proto_path="${PROTO_COPY_PATH}" ${PROTO_COPY_PATH}/sector.proto DEPENDS ${PROTO_COPY_PATH}/.copied # 依赖复制完成的标记,确保先复制再编译 ) set_source_files_properties(${PROTO_SOURCES} PROPERTIES GENERATED TRUE)
配置说明
- 本地临时目录:
PROTO_COPY_PATH指向构建目录下的子文件夹,完全是本地路径,彻底规避protoc对网络共享路径的识别问题。 - 高效复制逻辑:用CMake内置的
cmake -E copy命令批量复制,自动适配Windows/Linux路径分隔符;通过.copied标记文件避免重复复制操作,仅在源proto文件更新时触发复制。 - 跨平台兼容:所有路径处理和命令调用均使用CMake跨平台语法,无需针对不同系统编写分支逻辑。
额外注意事项
- 若proto文件存在
import依赖,需将所有被依赖的proto文件也加入PROTO_FILES列表,确保一并复制到临时目录。 - 如需在清理构建时删除临时复制的文件,可添加以下配置:
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${PROTO_COPY_PATH}") - 可通过
message(STATUS "Proto copy path: ${PROTO_COPY_PATH}")输出路径,验证是否为正确的本地构建路径。
内容的提问来源于stack exchange,提问作者gonzo
相关产品推荐
相关产品推荐

