CMake构建C++项目时出现'grpc/grpc.h'文件未找到错误求助
解决C++ gRPC项目中
grpc/grpc.h头文件找不到的问题 问题概述
在Mac Ventura系统上通过Homebrew安装gRPC与protobuf,开发基于gRPC的C++项目,已用protoc生成代码,但编译时出现fatal error: 'grpc/grpc.h' file not found错误。CMake配置阶段未提示找不到gRPC,仅在执行构建命令时触发错误。
项目配置文件
主CMakeLists.txt
# Project Name project("myproject") # Options set (CMAKE_CXX_STANDARD 20) set (CMAKE_CXX_STANDARD_REQUIRED 17) set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ../../../build/archive) set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ../../../build/lib) set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ../../../build/runtime) set (CMAKE_PROJECT_VERSION_MAJOR 1) set (CMAKE_PROJECT_VERSION_MINOR 0) set (CMAKE_PROJECT_VERSION_PATCH 0) set (CMAKE_PROJECT_VERSION_TWEAK 0) # CMake Required Version cmake_minimum_required(VERSION 3.24) # Include Directories include_directories("include") # Doxygen find_package(Doxygen) if (DOXYGEN_FOUND) # set input and output files set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/docs/Doxyfile.in) set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) # request to configure the file configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) message("Doxygen build started") # note the option ALL which allows to build the docs together with the application add_custom_target( docs ALL COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Generating API documentation with Doxygen" VERBATIM ) else (DOXYGEN_FOUND) message("Doxygen need to be installed to generate the doxygen documentation") endif (DOXYGEN_FOUND) # Google Test include(FetchContent) FetchContent_Declare( googletest URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip ) # For Windows: Prevent overriding the parent project's compiler/linker settings set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) # Directories add_subdirectory(src/Core) add_subdirectory(src/CoreGUI) add_subdirectory(src/gRPCServer) add_subdirectory(src/CameraServer) add_subdirectory(src/TestRunner) add_subdirectory(libraries/Math) add_subdirectory(libraries/ImageProcessing) add_subdirectory(libraries/DataStructures)
出错的子项目CMakeLists.txt
file(GLOB_RECURSE SOURCES LIST_DIRECTORIES true *.h *.cc) set(SOURCES ${SOURCES}) find_package(gRPC REQUIRED) find_package(protobuf REQUIRED) add_executable(myproject.Core ${SOURCES}) target_link_libraries(myproject.Core grpc) target_link_libraries(myproject.Core protobuf)
触发错误的C++代码
#include <grpc/grpc.h> #include <grpcpp/security/server_credentials.h> #include <grpcpp/server.h> #include <grpcpp/server_builder.h> #include <grpcpp/server_context.h> #include "_grpc/Configuration.grpc.pb.h" #include "../../libraries/DataStructures/RPCServerConfig.h" namespace myproject::Core::Services { class ConfigurationServiceProvider final : public ConfigurationService::Service { public: grpc::Status GetHUDConfig(grpc::ServerContext *context, const ConfigRequest* request, HUDConfig* response); void StartServer(); }; }
解决方案
1. 修正子项目CMake配置,使用gRPC官方CMake目标
直接链接grpc和protobuf无法自动导入头文件路径,应该使用gRPC提供的预定义CMake目标,这些目标会自动处理头文件包含和依赖链接。修改子项目CMakeLists.txt如下:
file(GLOB_RECURSE SOURCES LIST_DIRECTORIES true *.h *.cc) set(SOURCES ${SOURCES}) find_package(gRPC REQUIRED) find_package(protobuf REQUIRED) add_executable(myproject.Core ${SOURCES}) # 使用gRPC和protobuf的官方目标,自动处理头文件和链接 target_link_libraries(myproject.Core PRIVATE gRPC::grpc++ gRPC::grpc protobuf::libprotobuf ) # 包含当前子项目目录,确保_grpc下的生成文件能被找到 target_include_directories(myproject.Core PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
2. 确保CMake能找到Homebrew安装的gRPC路径
对于ARM64架构的Mac,Homebrew默认安装路径是/opt/homebrew;x86_64架构是/usr/local。如果CMake无法自动识别,可以在主CMakeLists.txt开头添加以下配置:
# 根据你的Mac架构选择路径 set(CMAKE_PREFIX_PATH "/opt/homebrew") # ARM64 # set(CMAKE_PREFIX_PATH "/usr/local") # x86_64
3. 验证gRPC的CMake配置
可以在配置CMake时添加-DCMAKE_VERBOSE_MAKEFILE=ON参数,查看编译时的头文件搜索路径,确认是否包含了gRPC的头文件目录:
cmake -S . -B build-files -DCMAKE_VERBOSE_MAKEFILE=ON cmake --build build-files/ --target myproject.CameraServer
内容的提问来源于stack exchange,提问作者Oliver Karger
相关产品推荐
相关产品推荐

