C++ Protobuf:无法打开message.pb.h文件中的include文件common.h

C++ Protobuf:无法打开message.pb.h文件中的include文件common.h,c++,visual-studio-2015,cmake,protocol-buffers,C++,Visual Studio 2015,Cmake,Protocol Buffers,我正在尝试编译此项目:。我使用msvc2015(x64)成功编译了protobuf。检查项目运行时没有错误(所有结果:通过) 我在cmake中设置了项目,提供了所有路径: Protobuf\u INCLUDE\u DIR=C:/TK/Protobuf-330/msvc2015\u 64/install/INCLUDE Protobuf\u LIBRARY\u DEBUG=C:/TK/Protobuf-330/msvc2015\u 64/install/lib/libprotobufd.lib P

我正在尝试编译此项目:。我使用msvc2015(x64)成功编译了protobuf。检查项目运行时没有错误(所有结果:通过)

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

Protobuf\u INCLUDE\u DIR=C:/TK/Protobuf-330/msvc2015\u 64/install/INCLUDE
Protobuf\u LIBRARY\u DEBUG=C:/TK/Protobuf-330/msvc2015\u 64/install/lib/libprotobufd.lib
Protobuf_LITE_LIBRARY_DEBUG=C:/TK/Protobuf-330/msvc2015_64/install/lib/libprotobuf lited.lib

Protobuf\u PROTOC\u EXECUTABLE=C:/TK/Protobuf-330/msvc2015\u 64/install/bin/PROTOC.exe
Protobuf\u PROTOC\u LIBRARY\u DEBUG=C:/TK/Protobuf-330/msvc2015\u 64/install/lib/libprotocd.lib
Protobuf\u SRC\u ROOT\u FOLDER=C:\TK\SRC\Protobuf-330\SRC

proto项目编译时没有任何错误。它包括
message.cc
message.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})
target_include_directories(proto
  PUBLIC
    "${Protobuf_INCLUDE_DIRS}")
然后构建它,我收到这个错误(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,是否存在一些已知问题?
提前谢谢。

我在这里做一个有根据的猜测,因为我对protobuf一无所知

首选
target.*
命令

原型项目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})
target_include_directories(proto
  PUBLIC
    "${Protobuf_INCLUDE_DIRS}")

也就是说,所有使用
proto
目标的东西都可以访问“${Protobuf_INCLUDE_DIRS}”中的任何INCLUDE,同时
proto
本身也可以访问它们。

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

TARGET_LINK_LIBRARIES(proto ${PROTOBUF_LIBRARY})

此更改后,它在我的电脑上工作。

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

不幸的是,这并不能解决我的问题。似乎主项目CMakeLists.txt没有设置${PROTOBUF_LIBRARY}变量。我知道这是有效的。谢谢你。这也是除了非局部变量之外,我在所有地方都默认使用小写的原因。由于Macxx和utopia,到处都是大写字母也使得它更难阅读。这也与Visual Studio 2017相关。我在proto项目CMakeLists.txt的末尾添加了两个建议行,并将两个项目的项目属性都更改为“多线程调试(/MTd)”。现在它开始工作了。仍然可以找出问题所在。欢迎任何建议。我添加了您的建议以及乌托邦提供的线路。谢谢