You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:31:33