【问题标题】:Protobuf: Cannot open include file common.h in message.pb.h fileProtobuf:无法在 message.pb.h 文件中打开包含文件 common.h
【发布时间】:2017-07-20 12:14:53
【问题描述】:

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

我在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

原型项目编译没有任何错误。它包括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 是否存在一些已知问题? 提前致谢。

【问题讨论】:

  • 感谢 Macxx 和乌托邦。我将建议的两行都添加到原型项目 CMakeLists.txt 的末尾,并将两个项目的项目属性更改为“多线程调试 (/MTd)”。现在它可以工作了。仍然可以弄清楚问题所在。欢迎提出任何建议。

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


【解决方案1】:

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

【讨论】:

  • 好点。这也是为什么我在除非局部变量之外的所有地方默认使用小写字母的原因。处处大写也使其更难阅读。
  • 也与 Visual Studio 2017 相关
【解决方案2】:

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

来完成
TARGET_LINK_LIBRARIES(proto ${PROTOBUF_LIBRARY})

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

【讨论】:

  • 我添加了您的建议以及乌托邦提供的线路。谢谢
【解决方案3】:

我将在这里进行有根据的猜测,因为我对 protobuf 一无所知。

首选target_* 命令。

原型项目 CMakeLists.txt:

target_include_directories(proto
  PUBLIC
    "${Protobuf_INCLUDE_DIRS}")

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

【讨论】:

  • 不幸的是,这并不能解决我的问题。似乎主项目 CMakeLists.txt 没有设置 ${PROTOBUF_LIBRARY} 变量。
  • 我添加了您的建议以及 Macxx 提供的行。知道它有效。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 2012-07-10
  • 2016-06-17
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多