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

Linux C++子目录CMake整合Protobuf至单元测试遇头文件缺失错误

问题解决方案

核心问题分析

报错fatal error: protobuf/message.pb.h: not found的本质是:

  • 根目录未触发src/protobuf子目录的构建,导致Protobuf代码未生成
  • 生成的.pb.h文件路径未正确导出给测试程序
  • 全局include_directories的使用方式不够规范,无法自动传递依赖路径

1. 修复根目录CMakeLists.txt

根目录缺少对src/protobuf子目录的构建引用,添加后才能生成Protobuf代码:

cmake_minimum_required(VERSION 3.16.3)
cmake_policy(SET CMP0016 NEW)

project(protobuf_parser VERSION 1.0.0 DESCRIPTION "Разбор потока length-prefixed Protobuf сообщений на C++")

include_directories(${CMAKE_SOURCE_DIR}/src)

# 新增:触发protobuf子目录的构建
add_subdirectory(src/protobuf)

enable_testing()
add_subdirectory(test)

2. 修正Protobuf库的头文件导出逻辑

将src/protobuf目录的全局include_directories替换为目标级别的路径导出,确保依赖该库的测试程序能自动获取头文件路径:

include(FindProtobuf)
find_package(Protobuf REQUIRED)

# 指定生成的头文件放在protobuf子目录下,匹配代码中的#include <protobuf/message.pb.h>
set(PROTO_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/protobuf)
file(MAKE_DIRECTORY ${PROTO_OUTPUT_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS 
    OUT_DIR ${PROTO_OUTPUT_DIR}
    message.proto
)

add_library(protobuf ${PROTO_SRCS} ${PROTO_HDRS})
# 导出系统Protobuf头文件和生成的自定义头文件路径
target_include_directories(protobuf 
    PUBLIC 
        ${Protobuf_INCLUDE_DIRS}
        ${CMAKE_CURRENT_BINARY_DIR}
)
target_link_libraries(protobuf INTERFACE ${Protobuf_LIBRARIES})

3. 简化测试目录CMake配置

测试程序无需手动指定二进制目录,依赖的protobuf库已自动传递头文件路径:

cmake_minimum_required(VERSION 3.16)

add_executable(Example Test_Helpers.cpp)
target_link_libraries(Example PUBLIC
    gtest_main
    protobuf_parser
    protobuf
)
add_test(
    NAME Example
    COMMAND Example
)

内容的提问来源于stack exchange,提问作者mikluxa21

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:07:41