Skip to content

Commit

Permalink
Fix undefined symbol error around SharedCtor()
Browse files Browse the repository at this point in the history
Apparently, protocolbuffers#8532 was incorrect if applied to 3.17.x branch.

3.17.x changed code generation to mark `SharedCtor()` and `SharedDtor()` as inline in .pb.cc.

It looks like we have a compile-time undefined behavior in C++ now. As cppreference.com [says](https://en.cppreference.com/w/cpp/language/inline):

_The definition of an inline function <...> must be reachable in the translation unit where it is accessed (not necessarily before the point of access)._

As protobuf allows custom plugins to generate custom code, there is no limitation on where SharedCtor couble be possible referenced from. In our case we have SharedCtor invoked from corresponding `.pb.h` code, thus triggering:
```
ld: error: undefined symbol: package::Message::SharedCtor()`
>>> referenced by file.pb.h:$$$$
```

If this patch is not applicable, I can take a look into changing the code generation, but doing this will be harder then removing _inline_.
  • Loading branch information
georgthegreat committed Jul 20, 2021
1 parent d662ec9 commit 201c710
Showing 1 changed file with 1 addition and 1 deletion.
2 changes: 1 addition & 1 deletion src/google/protobuf/compiler/cpp/cpp_message.cc
Expand Up @@ -2381,7 +2381,7 @@ std::pair<size_t, size_t> MessageGenerator::GenerateOffsets(
void MessageGenerator::GenerateSharedConstructorCode(io::Printer* printer) {
Formatter format(printer, variables_);

format("inline void $classname$::SharedCtor() {\n");
format("void $classname$::SharedCtor() {\n");

std::vector<bool> processed(optimized_order_.size(), false);
GenerateConstructorBody(printer, processed, false);
Expand Down

0 comments on commit 201c710

Please sign in to comment.