不使用系统 Protobuf 库时,“Protobuf 编译器版本与库版本 3.6.1 不匹配”

Jig*_*orp 5 c++ cmake protocol-buffers

我使用 CMake 作为构建工具,并为我在项目中使用的所有库预先打包了二进制文件。这些库之一是 Protobuf,可通过 Conan IO 下载。所以,我想使用 Conan 下载的 Protobuf 而不是 Linux 已经安装的 Protobuf。问题是我在运行时收到以下错误CMake

CMake Warning at /home/username/Documents/project/test/build/venv/lib/python3.6/site-packages/cmake/data/share/cmake-3.10/Modules/FindProtobuf.cmake:455 (message):
  Protobuf compiler version doesn't match library version 3.6.1
Call Stack (most recent call first):
  /home/username/Documents/project/test/script/cmake/Env.cmake:139 (include)
  CMakeLists.txt:6 (include)


-- Found Protobuf: /home/username/Documents/project/test/build/venv/.conan/data/Protobuf/3.6.1/project/dev/package/80043e232e8ab07f4b25e67652a9490d9ad33d91/lib/libprotobuf.so;-lpthread (found version "3.6.1") 
CMake Warning at /home/username/Documents/project/test/build/venv/lib/python3.6/site-packages/cmake/data/share/cmake-3.10/Modules/FindProtobuf.cmake:455 (message):
  Protobuf compiler version doesn't match library version 3.6.1
Call Stack (most recent call first):
  /home/username/Documents/project/test/src/shared/bysp/CMakeLists.txt:9 (find_package)
Run Code Online (Sandbox Code Playgroud)

有没有办法来解决这个问题?这是会导致错误的东西吗?

arh*_*aco 9

我在 Raspberry 中解决了这个问题,在 CMake 调用中添加了下一个选项。

 -D Protobuf_PROTOC_EXECUTABLE=/usr/bin/protoc
Run Code Online (Sandbox Code Playgroud)


Die*_*ino 5

就我而言,问题是cmake实际上无法找到 Protobuf 编译器的正确路径。

如果您检查 CMake 的FindProtobuf.cmake模块 ( /usr/share/cmake-3.13/Modules/FindProtobuf.cmake ),则会在此处出现警告消息:

if(NOT "${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}" VERSION_EQUAL "${Protobuf_VERSION}")
   message(WARNING "Protobuf compiler version ${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}"
          " doesn't match library version ${Protobuf_VERSION}")
endif()
Run Code Online (Sandbox Code Playgroud)

预计警告消息将打印出系统中安装的实际 Protobuf 编译器版本。但是,实际版本号并不是消息的一部分。

FindProtobuf.cmake模块中,如果您在尝试获取 Profobuf 编译器的路径时检查上面的某些行,它会执行以下操作:

# Find the protoc Executable
find_program(Protobuf_PROTOC_EXECUTABLE
    NAMES protoc
    DOC "The Google Protocol Buffers Compiler"
    PATHS
    ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Release
    ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Debug
)
Run Code Online (Sandbox Code Playgroud)

后面没有代码检查是否可以找到路径。下一步是执行程序并检查版本:

# Check Protobuf compiler version to be aligned with libraries version
execute_process(COMMAND ${Protobuf_PROTOC_EXECUTABLE} --version
                OUTPUT_VARIABLE _PROTOBUF_PROTOC_EXECUTABLE_VERSION)

if("${_PROTOBUF_PROTOC_EXECUTABLE_VERSION}" MATCHES "libprotoc ([0-9.]+)")
  set(_PROTOBUF_PROTOC_EXECUTABLE_VERSION "${CMAKE_MATCH_1}")
endif()
Run Code Online (Sandbox Code Playgroud)

而且,至少在我的系统中,没有protoc程序(但是protoc-c),因此此检查失败,这也是警告消息不打印系统中安装的 Protobuf 编译器实际版本的消息的原因。

解决方案是将find_program语句更改为:

# Find the protoc Executable
find_program(Protobuf_PROTOC_EXECUTABLE
    NAMES protoc-c protoc
    DOC "The Google Protocol Buffers Compiler"
    PATHS
    ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Release
    ${Protobuf_SRC_ROOT_FOLDER}/vsprojects/${_PROTOBUF_ARCH_DIR}Debug
)
Run Code Online (Sandbox Code Playgroud)

并在重新运行之前删除CMakeCache.txtCMakeFiles/cmake


小智 0

看起来您下载的协议由于某种原因无法启动。尝试获取protobuf版本

./protoc --version
Run Code Online (Sandbox Code Playgroud)

在相应的目录中。