Protobuf:无法在message.pb.h文件中打开包含文件common.h

时间:2017-07-20 12:14:54

标签: c++ visual-studio-2015 cmake protocol-buffers

我正在尝试编译这个项目:https://github.com/shaochuan/cmake-protobuf-example。我用msvc2015(x64)成功编译了protobuf。检查项目运行没有错误(所有结果:已通过)。

我在cmake中设置了项目,提供了所有路径:

Protobuf_INCLUDE_DIR=C:/TK/protobuf-330/msvc2015_64/install/include     Protobuf_LIBRARY_DEBUG=C:/TK/protobuf-330/msvc2015_64/install/lib/libprotobufd.lib           Protobuf_LITE_LIBRARY_DEBUG=C:/TK/protobuf-330/msvc2015_64/install/lib/libprotobuf-lited.lib

Protobuf_PROTOC_EXECUTABLE=C:/TK/protobuf-330/msvc2015_64/install/bin/protoc.exe Protobuf_PROTOC_LIBRARY_DEBUG=C:/TK/protobuf-330/msvc2015_64/install/lib/libprotocd.lib Protobuf_SRC_ROOT_FOLDER=C:\TK\src\protobuf-330\src

proto项目编译时没有任何错误。它包含message.ccmessage.h个文件。 CMakeLists.txt看起来像这样:

INCLUDE(FindProtobuf)
FIND_PACKAGE(Protobuf REQUIRED)
INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIR})
PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_HEADER message.proto)
ADD_LIBRARY(proto ${PROTO_HEADER} ${PROTO_SRC})

如果我使用以下CMakeLists.txt编译主项目:

PROJECT(rpc)
CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
ADD_SUBDIRECTORY(proto)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
ADD_EXECUTABLE(main main.cpp)
TARGET_LINK_LIBRARIES(main proto ${PROTOBUF_LIBRARY})

然后构建它,我收到此错误(C1083)说:

  

“无法打开包含文件:'google / protobuf / stubs / common.h':没有这样的文件或目录”c:\ tktest \ protobuftest \ src \ proto \ message.pb.h

在文件中,错误的行是:

#include <google/protobuf/stubs/common.h>

我无法弄清楚出了什么问题。感谢任何提示。有关cmake + protobuf + visual studio 2015的一些已知问题吗? 提前谢谢。

3 个答案:

答案 0 :(得分:2)

在您的CMakeLists.txt中,您应该将PROTOBUF_INCLUDE_DIR替换为Protobuf_INCLUDE_DIRProtobuf_INCLUDE_DIRS(请注意结尾处的S)和PROTOBUF_LIBRARY替换为Protobuf_LIBRARY }或Protobuf_LIBRARIES。 CMake变量名称区分大小写。我刚刚查看了CMake 3.9版本。使用find_package(Protobuf)时隐式调用的FindProtobuf.cmake模块在运行成功时定义了这些变量。

答案 1 :(得分:0)

因为我对protobuf一无所知,所以我会在这里采取有根据的猜测。

首选target_*命令。

proto-project CMakeLists.txt:

target_include_directories(proto
  PUBLIC
    "${Protobuf_INCLUDE_DIRS}")

也就是说,使用proto目标的所有内容都可以访问“$ {Protobuf_INCLUDE_DIRS}”中的任何包含,以及proto本身也可以访问它们。

答案 2 :(得分:0)

在我的电脑上,项目正在编译,但没有链接。因此,要解决此问题,库 proto 需要链接protobuf库。这可以通过将以下行添加到proto/CMakeLists.txt

来完成
TARGET_LINK_LIBRARIES(proto ${PROTOBUF_LIBRARY})

此更改后,它可以在我的电脑上运行。