Because of the way dynamic linking works on Linux, it's only possible to have one version of the protobuf library loaded into any process. Because you are statically linking against libprotobuf, your statically-linked version is "winning" over any other version that might be in the dependency tree.

It looks like you are also linking against libmirprotobuf3.so, which is a library containing protobuf definitions for Mir. That library in turn specifies a dependency on libprotobuf.so (or libprotobuf-lite.so, it looks like). That dependency is being totally overridden my your statically-linked copy.

However, libmirprotobuf3.so was built against protobuf 3.0.0. It cannot use any other version. Since you're forcing it to try to use protobuf 2.6.1, it fails.

Your only two options are:

Update your app to protobuf 3.0.0.

Avoid linking against libmirprotobuf3.so.

Upgrading my app to use protobuf 3 is not a possibility at this moment in time.

Why not? Version 3 of the protobuf library is backwards-compatible with programs written using version 2 of the protobuf lanugage. The new proto3 "features" (or lack of features) only apply if you opt in using syntax = "proto3";; as long as you don't do that, you shouldn't need to make any changes. You will of course need to regenerate your .pb.cc and .pb.h files using version 3 of protoc, but hopefully your makefiles do that automatically.