CMake构建gRPC项目时无法找到.proto生成的C++头文件问题求助
问题成因
- 包含路径作用域错误:
protos/CMakeLists.txt中使用的include_directories命令是目录级作用域,仅对当前protos目录及其子目录下的目标生效,同级的client目录下的编译目标无法继承该路径,所以编译client.cpp时找不到生成在构建目录下的头文件。 - 库目标未对外暴露头文件路径:生成的
my_grpc_proto库没有声明公开包含目录,依赖该库的client目标无法自动获取头文件搜索路径。 - (可选)路径配置不统一:你提到生成代码存放在
build/bin目录,但代码中配置的生成输出路径是${PROJECT_BINARY_DIR}(即build根目录),如果实际生成路径和配置不一致也会导致找不到文件。
解决方案
- 修改
protos/CMakeLists.txt,删除原有的include_directories("${PROJECT_BINARY_DIR}")行,改为给my_grpc_proto目标设置公开包含目录,依赖该库的目标会自动继承该路径:
add_library(my_grpc_proto ${my_grpc_srcs} ${my_grpc_hdrs} ${my_proto_srcs} ${my_proto_hdrs}) # 新增以下内容 target_include_directories(my_grpc_proto PUBLIC $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}> )
- 如果你确实需要将生成的proto代码输出到
build/bin目录,统一调整所有路径配置:- 将
my_proto_srcs、my_proto_hdrs等变量的路径前缀改为${PROJECT_BINARY_DIR}/bin - 将
add_custom_command中--grpc_out、--cpp_out的参数改为"${PROJECT_BINARY_DIR}/bin" - 将上一步
target_include_directories中的路径改为${PROJECT_BINARY_DIR}/bin
- 将
- 清除旧的build目录,重新执行cmake构建流程即可。
内容的提问来源于stack exchange,提问作者Suslik
相关产品推荐
相关产品推荐

