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.b 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.
I believe the way we use globals in protobuf makes it impossible to link protos into separate dynamic libs and have protos in their public interfaces. The "file already exists in database" error is not hard to fix but I'm pretty sure that's not the only error you will see. I think you either need to avoid linking protos into separate .so, or try to use protobuf-lite where we don't have as much globals as we have for full runtime.
I had the same issue on windows7,I have a project that have an c++ executable core, and an shared objects (dll),When the core launches, it will load the library with LoadLibrary , it crushes with error.
vs2015 output:Microsoft C++ 寮傚父: google::protobuf::FatalException
protobuf version:3.3.0
@gkl23
load dll with protobuf generated .pb.h/cc file by LoadLibrary is more complicated, you can not load pb file in different dll. so all the *.pb.h/cc should only load in one dll. If you want to use protobuf class out of that dll , you shoud export it by __declspec(dllexport) under windows.
Most helpful comment
I believe the way we use globals in protobuf makes it impossible to link protos into separate dynamic libs and have protos in their public interfaces. The "file already exists in database" error is not hard to fix but I'm pretty sure that's not the only error you will see. I think you either need to avoid linking protos into separate .so, or try to use protobuf-lite where we don't have as much globals as we have for full runtime.