我正在尝试编译这个项目: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.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})
然后构建它,我收到此错误(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的一些已知问题吗? 提前谢谢。
答案 0 :(得分:2)
在您的CMakeLists.txt中,您应该将PROTOBUF_INCLUDE_DIR
替换为Protobuf_INCLUDE_DIR
或Protobuf_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})
此更改后,它可以在我的电脑上运行。