在编译谷歌的protobuf示例时,CMake找不到protobuf。

5
我已经尝试了两天来解决这个问题,但没有成功。我在网上阅读了无数的帖子,并尝试了很多建议,但到目前为止都没有成功。
我正在Windows 10上使用VS2017和最新的VS Code进行操作。我通过vcpkg install protobuf安装了protobuf:

The package protobuf:x64-windows provides CMake targets:

find_package(protobuf CONFIG REQUIRED)
target_link_libraries(main PRIVATE protobuf::libprotoc protobuf::libprotobuf protobuf::libprotobuf-lite)

我下载了谷歌的示例代码并将其解压到我的驱动器上。 .PROTO文件可以顺利编译:

d:\protobuf-3.12.2\examples>protoc -I=d:\protobuf-3.12.2\examples --cpp_out=d:\protobuf-3.12.2\examples d:\protobuf-3.12.2\examples\addressbook.proto

并且按预期创建了两个文件 "addressbook.pb.cc" 和 "addressbook.pb.h"。

现在,无论我如何修改 CMakeLists.txt 文件,尝试在 Visual Studio Code 中编译该项目都会不断失败。正如提到的那样,我浏览了数十个关于这个问题的主题,并尝试了很多方法,但都没有成功。


更新于2020年5月29日

我检查了一下,发现protobuf只安装了一次,事实上演示包也包含了完整的protobuf安装。我删除了这个额外的演示包并使用vcpgk卸载/安装protobuf。然后,我使用已经在我的路径中的protoc编译了.proto文件,并获得了两个文件“addressbook.pb.cc”和“addressbook.pb.h”。

然后,我再次尝试编译项目,这次使用演示附带的CMakeLists.txt

相关部分似乎就在开头:

# Minimum CMake required
cmake_minimum_required(VERSION 2.8.12)
# Project
project(protobuf-examples)
# Find required protobuf package
find_package(protobuf CONFIG REQUIRED)
if(protobuf_VERBOSE)
  message(STATUS "Using Protocol Buffers ${Protobuf_VERSION}")
endif()
set(CMAKE_INCLUDE_CURRENT_DIR TRUE)

编译这个会给我以下结果:
[main] Building folder: examples 
[main] Configuring folder: examples 
[cms-client] Configuring using the "Visual Studio 15 2017" CMake generator with platform "x64" and toolset "host=x64"
[cmake] Selecting Windows SDK version 10.0.17763.0 to target Windows 
...
[cmake] CMake Error at CMakeLists.txt:8 (find_package):
[cmake]   Could not find a package configuration file provided by "protobuf" with any
[cmake]   of the following names:
[cmake] 
[cmake]     protobufConfig.cmake
[cmake]     protobuf-config.cmake
[cmake] 
[cmake]   Add the installation prefix of "protobuf" to CMAKE_PREFIX_PATH or set
[cmake]   "protobuf_DIR" to a directory containing one of the above files.  If
[cmake]   "protobuf" provides a separate development package or SDK, be sure it has
[cmake]   been installed.
[cmake] 
[cmake] 
[cmake] Configuring incomplete, errors occurred!
[cmake] See also "d:/vcpkg/buildtrees/protobuf/src/v3.12.0-8ba83cbbdb/examples/build/CMakeFiles/CMakeOutput.log".
[cms-driver] Error during CMake configure: [cmake-server] Configuration failed.

在protobuf文件夹中可以找到多个名为protobuf-config.cmake的文件:
  • D:\vcpkg\buildtrees\protobuf\<BUILDCFG>\share\protobuf\protobuf-config.cmake
  • D:\vcpkg\installed\<BUILDCFG>\share\protobuf\protobuf-config.cmake
  • D:\vcpkg\packages\<BUILDCFG>\share\protobuf\protobuf-config.cmake
什么原因导致CMake无法找到这些文件?
3个回答

0
this线程中,Fraser解决了这个问题,但如果您需要根据protobuf CMake配置进行开发,并在CMake中使用find_package命令查找protobuf库,则必须使用CMake编译您的protobuf库,而不是使用configure例程。 在使用CMake编译protobuf后,将在prefix/lib/CMake/protobuf目录中生成一个名为protobuf-config.cmake的配置文件。

0

提醒一下,我不是专家。

在自己的构建中,我遇到了类似的问题,试图让Boost工作起来,我认为这与您的环境变量以及Visual Studio的设置有关。当您设置关键事项时,例如

SET(PROTOBUF_INCLUDE_DIR "d:/vcpkg/packages/protobuf_x64-windows/include/")

实际上,find_package(protobuf CONFIG REQUIRED)会忽略这些设置。一旦它找到了配置文件,它只关心配置文件找到了什么,我认为这就是你的第一个MESSAGE找到正确的原因,而第二个MESSAGE没有找到的原因。

你确定你的机器上只安装了一个protobuf吗?

  • 它似乎在这里找到了“用作目录D:/protobuf-3.12.2/examples中的包含目录”
  • 但你正在尝试找到“D:/vcpkg/packages/protobuf_x64-windows”,是吗?

尝试在Visual Studio的CMake选项中添加“-DCMAKE_PREFIX_PATH="d:/vcpkg/packages/protobuf_x64-windows"”

祝你好运,如果这没有帮助,很抱歉,我对编程相对较新,但值得一试。


1
这实际上只是编译环境中的环境变量问题。 与我的boost文件相关的上下文 安装boost将它们放在:“C:/users/name/folder/x64” 这就是我设置我的CMAKE_PREFIX_PATH的位置。 现在,在那个x64文件夹里,我有一个includelib文件夹。在我的lib文件夹里,有一个cmake文件夹,其中包含所有我的config.cmake文件。您的CMAKE_PREFIX_PATH需要指向您安装的根文件夹。 在您的CMakeLists中,将protobuf_DIR设置为同一根文件夹也不会有任何损失。 - Austin
好的,我已经在我的CMakeLists.txt中添加了CMAKE_PREFIX_PATH,但现在出现了一个更奇怪的新问题。请查看更新后的问题。 - Andreas
@Andreas 我真的不知道接下来该怎么做了,这似乎不再是CMake编译问题,更像是语法问题,我不知道为什么。也许可以尝试创建一个新的相关线程?我不确定第108行到底想要做什么,看起来它似乎是在尝试将目录与潜在格式匹配,如果是这样,我的唯一建议是反斜杠在cmake解析中无效,但正斜杠有效。 - Austin
@Andreas,你用的是哪个版本的CMake?我会继续尝试解决这个问题。 - Austin
我的CMake版本是3.18.0-rc2。无论如何,我现在打算放弃protobuf和gRPC。非常感谢您的帮助,它解决了最初的问题。我会重新措辞问题并将您的答案标记为正确答案。 - Andreas
显示剩余4条评论

-1

如果您的问题在于找到 protobuf 安装,则说明您的 protobuf 路径不在环境变量中,请尝试将其添加到您的路径中,并告诉我是否已经添加。

如果这种情况仍然存在,我很乐意为您提供更多帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接