cmake “Protobuf编译器版本与库版本3不匹配,不使用系统Protobuf库时为6.1”

ioekq8ef  于 2023-04-30  发布在  其他
关注(0)|答案(5)|浏览(804)

我使用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)

有办法解决吗?这是否会导致错误?

6ie5vjzr

6ie5vjzr1#

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

-D Protobuf_PROTOC_EXECUTABLE=/usr/bin/protoc
qnzebej0

qnzebej02#

在我的例子中,问题是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()

预计警告消息将打印出系统中安装的实际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
)

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

# 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()

因为,至少在我的系统中,没有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
)

然后删除 CMakeCache。txtCMakeFiles/

klr1opcd

klr1opcd3#

不要忘记安装编译器,在Ubuntu和Debian上,你应该安装lib和C++编译器,如下所示:

sudo apt install libprotobuf-dev protobuf-compiler
ryhaxcpt

ryhaxcpt4#

看来你下载的协议因为某种原因无法启动。尝试获取protobuf版本

./protoc --version

在相应目录中。

voase2hg

voase2hg5#

基于arhuaco的回答,可以在cmake config中使用:

set(Protobuf_PROTOC_EXECUTABLE /usr/bin/protoc)

相关问题