C++ Protobuf:无法打开message.pb.h文件中的include文件common.h
我正在尝试编译此项目:。我使用msvc2015(x64)成功编译了protobuf。检查项目运行时没有错误(所有结果:通过) 我在cmake中设置了项目,提供了所有路径: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
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)”。现在它开始工作了。仍然可以找出问题所在。欢迎任何建议。我添加了您的建议以及乌托邦提供的线路。谢谢