JigsawCorp
JigsawCorp

Reputation: 589

"Protobuf compiler version doesn't match library version 3.6.1" when not using system Protobuf library

I am using CMake as a build tool and have pre-packaged binaries for all libraries I use in my project. One of those libraries is Protobuf and gets downloaded via Conan IO. So, I want to use the Protobuf downloaded by Conan and not the one already installed by Linux. The problem is that I get the following error when running 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)

Is there a way to fix this? Is this something that can cause errors?

Upvotes: 9

Views: 25200

Answers (5)

Arslaaan
Arslaaan

Reputation: 1

Based on arhuaco answer, its possible to use in cmake config:

set(Protobuf_PROTOC_EXECUTABLE /usr/bin/protoc)

Upvotes: 0

Santiwake
Santiwake

Reputation: 89

Don't forget to install the compiler, on Ubuntu and Debian you should install the lib and the compiler as follows for C++:

sudo apt install libprotobuf-dev protobuf-compiler

Upvotes: 3

arhuaco
arhuaco

Reputation: 1755

I solved it in a Raspberry adding the next option to the CMake call.

 -D Protobuf_PROTOC_EXECUTABLE=/usr/bin/protoc

Upvotes: 9

Diego Pino
Diego Pino

Reputation: 11586

In my case, the problem was that cmake couldn't actually find the correct path to my Protobuf compiler.

If you check CMake's FindProtobuf.cmake module (/usr/share/cmake-3.13/Modules/FindProtobuf.cmake), the warning message happens here:

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

It's expected that the warning message will print out the actual Protobuf compiler version installed in your system. However, the actual version number is not part of the message.

In the FindProtobuf.cmake module, if you check some lines above when it tries to get the path to the Profobuf compiler, it does:

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

There's no code later that checks whether a path could be found. The next step is executing the program and checking what's the version:

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

And since, at least it my system, there's no protoc program (but protoc-c), this check fails and that's also the reason why the warning message doesn't print a message for the actual version of the Protobuf compiler installed in the system.

The solution is to change the find_program statement to something like:

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

And remove CMakeCache.txt and CMakeFiles/ before rerunning cmake.

Upvotes: 5

prankster
prankster

Reputation: 1

Looks like your downloaded protoc can't start for some reason. Try to get protobuf version

./protoc --version

in corresponding dir.

Upvotes: 0

Related Questions