'Several shared object using same proto leading the the error: file already exists in database

An error related to protobuf3

I have a project that have an c++ executable core, and several shared objects (.so, .dll) called plugins. When the core launches, it will load those plugins with dlopen. The core and plugins using protobuf as communication protocol, so they have to compile the generated .pb.cc and .ph.h files into their binaries to have the copy of the serializer/deserializer. And libprotobuf.so link to both the core and plugins. When I launch the core, it crushes with error: file already exists in database, same error in #863

I'm using protobuf-3 beta2, and Ubuntu 14.04. This error only happens on Linux. The program works fine on Windows and OS X.

I have also tried another way which compile all the generated protobuf files into a dynamic library (protocol.so), then the core and plugins were linked to protocol.so and libprotobuf.so. This works fine. Of course, because in #1062 the bug has been fixed. But when I changed the protocol.so into protocol.a, it failed again. I think it is same as compile generated .pb.cc separately.

I don't want to compile a protocol.so, because it is inconvenient for me to extend the communication protocol when I add more and more plugins. I think compile the generated .pb.cc into the plugin's binary is better (this work well on windows and OS X).

Any suggestions to fix this error are appreciated.



Solution 1:[1]

I was able to get around this problem by adding RTLD_GLOBAL to dlopen which takes existing known symbols into account.

Solution 2:[2]

I solved this problem by adding RTLD_DEEPBIND to dlopen.

Solution 3:[3]

In my case, I was getting the "File already exists in database" error when trying to run a plugin in Gazebo with the tutorial project.

I was able to solve this by copying the .so file to my local directory where I was trying to launch the program instead of setting a GAZEBO_PLUGIN_PATH variable to the build directory.

I hope a similar solution will work for others when facing problems other than Gazebo plugins. (maybe the general solution is to copy your .so file to the local instead of build)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user1624886
Solution 2 spxcds
Solution 3 Karter Krueger