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
相关产品推荐
相关产品推荐

