Re: [protobuf] C++ link error when using "repeated" with a custom message

2021-03-11 Thread 'Adam Cozzette' via Protocol Buffers
I suspect that your build is somehow mixing multiple protobuf versions. For
C++, the version of protoc used to generate code must exactly match the
libprotobuf library version, and it's also important that the headers you
compile against are the same version as the library you link against.
RepeatedPtrFieldBase::AddOutOfLineHelper was added fairly recently, so I
think your build is probably using a new version of protoc and new headers,
but still somehow linking against an old version of libprotobuf.

On Thu, Mar 11, 2021 at 3:13 AM Xavier Raemy  wrote:

> After hours of debugging, I have the following minimalist .proto file:
>
>
> syntax = "proto3";
>
>
> message PbCaptureResult {
>
> bool checkedValid = 1;
>
> }
>
>
> message PbCaptureResultSequence {
>
> PbCaptureResult captureResults = 1;
>
> }
>
> It compiles and links successfully. But, if I add a "repeated" like:
>
>
> syntax = "proto3";
>
>
> message PbCaptureResult {
>
> bool checkedValid = 1;
>
> }
>
>
> message PbCaptureResultSequence {
>
> repeated PbCaptureResult captureResults = 1;
>
> }
>
> then I have a link error and get:
>
>
> cmd.exe /C "cd . &&
> C:\Android\Sdk\ndk\22.0.6917172\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe
> --target=aarch64-none-linux-android29
> --gcc-toolchain=C:/Android/Sdk/ndk/22.0.6917172/toolchains/llvm/prebuilt/windows-x86_64
> --sysroot=C:/Android/Sdk/ndk/22.0.6917172/toolchains/llvm/prebuilt/windows-x86_64/sysroot
> -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables
> -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2
> -Wformat -Werror=format-security  -Wno-deprecated-declarations -O0
> -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a
> -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a
> -Wl,--build-id=sha1 -Wl,--fatal-warnings -Wl,--no-undefined
> -Qunused-arguments -shared -Wl,-soname,libnative-lib.so -o libnative-lib.so
> @CMakeFiles/native-lib.rsp  && cd ."
>
> ld: error: undefined symbol:
> google::protobuf::internal::RepeatedPtrFieldBase::AddOutOfLineHelper(void*)
>
> >>> referenced by repeated_field.h:1767
> (../../../../imported-lib/include\google/protobuf\repeated_field.h:1767)
>
> >>>
>  
> CMakeFiles/native-lib.dir/src/main/cpp/authenticationLib/CaptureResultSequence.pb.cc.o:(google::protobuf::RepeatedPtrField::TypeHandler::Type*
> google::protobuf::internal::RepeatedPtrFieldBase::Add::TypeHandler>(google::protobuf::RepeatedPtrField::TypeHandler::Type*))
>
> clang++: error: linker command failed with exit code 1 (use -v to see
> invocation)
>
> If the "repeated" come before a "standard type" such as string then it
> compiles:
>
>
> syntax = "proto3";
>
>
> message PbCaptureResult {
>
> bool checkedValid = 1;
>
> }
>
>
> message PbCaptureResultSequence {
>
> repeated string captureResults = 1;
>
> }
>
> it's only if I try to repeat a custom message that I have an issue.
>
>
> But in the protobuf website I found the following example:
>
>
> message SearchResponse {
>
>   repeated Result results = 1;
>
> }
>
>
> message Result {
>
>   string url = 1;
>
>   string title = 2;
>
>   repeated string snippets = 3;
>
> }
>
> I have put the example as is in my .proto file and it failed to compile
> with the same linking error. I concluded that it's not a .proto syntax
> problem.
>
> It's protobuf 3.15.5.
>
> The generating command is: ./bin/protoc.exe --cpp_out=..
> CaptureResultSequence.proto
>
> I am static linking against libprotobuf.a (not libprotobuf-lite.a)
>
> I have cross compiled protobuf myself
>
> I initially thought that the issue was related to linking, but for me it
> doesn't explain why I can link without "repeated" but can't link with it.
>
> --
> You received this message because you are subscribed to the Google Groups
> "Protocol Buffers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to protobuf+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/protobuf/035ec0f4-a4fc-4131-b9fc-b97c6a682dfan%40googlegroups.com
> 
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to protobuf+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/protobuf/CADqAXr5uepbXwDj2iPOctidwrovrQqYWEpi7b0uStpJrZ_bbFw%40mail.gmail.com.


[protobuf] C++ link error when using "repeated" with a custom message

2021-03-11 Thread Xavier Raemy


After hours of debugging, I have the following minimalist .proto file:


syntax = "proto3";


message PbCaptureResult {

bool checkedValid = 1;

}


message PbCaptureResultSequence {

PbCaptureResult captureResults = 1;

}

It compiles and links successfully. But, if I add a "repeated" like:


syntax = "proto3";


message PbCaptureResult {

bool checkedValid = 1;

}


message PbCaptureResultSequence {

repeated PbCaptureResult captureResults = 1;

}

then I have a link error and get:


cmd.exe /C "cd . && 
C:\Android\Sdk\ndk\22.0.6917172\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe
 
--target=aarch64-none-linux-android29 
--gcc-toolchain=C:/Android/Sdk/ndk/22.0.6917172/toolchains/llvm/prebuilt/windows-x86_64
 
--sysroot=C:/Android/Sdk/ndk/22.0.6917172/toolchains/llvm/prebuilt/windows-x86_64/sysroot
 
-fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables 
-fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 
-Wformat -Werror=format-security  -Wno-deprecated-declarations -O0 
-fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a 
-Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a 
-Wl,--build-id=sha1 -Wl,--fatal-warnings -Wl,--no-undefined 
-Qunused-arguments -shared -Wl,-soname,libnative-lib.so -o libnative-lib.so 
@CMakeFiles/native-lib.rsp  && cd ."

ld: error: undefined symbol: 
google::protobuf::internal::RepeatedPtrFieldBase::AddOutOfLineHelper(void*)

>>> referenced by repeated_field.h:1767 
(../../../../imported-lib/include\google/protobuf\repeated_field.h:1767)

>>>  
 
CMakeFiles/native-lib.dir/src/main/cpp/authenticationLib/CaptureResultSequence.pb.cc.o:(google::protobuf::RepeatedPtrField::TypeHandler::Type*
 
google::protobuf::internal::RepeatedPtrFieldBase::Add::TypeHandler>(google::protobuf::RepeatedPtrField::TypeHandler::Type*))

clang++: error: linker command failed with exit code 1 (use -v to see 
invocation)

If the "repeated" come before a "standard type" such as string then it 
compiles:


syntax = "proto3";


message PbCaptureResult {

bool checkedValid = 1;

}


message PbCaptureResultSequence {

repeated string captureResults = 1;

}

it's only if I try to repeat a custom message that I have an issue.


But in the protobuf website I found the following example:


message SearchResponse {

  repeated Result results = 1;

}


message Result {

  string url = 1;

  string title = 2;

  repeated string snippets = 3;

} 

I have put the example as is in my .proto file and it failed to compile 
with the same linking error. I concluded that it's not a .proto syntax 
problem.

It's protobuf 3.15.5.

The generating command is: ./bin/protoc.exe --cpp_out=.. 
CaptureResultSequence.proto

I am static linking against libprotobuf.a (not libprotobuf-lite.a)

I have cross compiled protobuf myself

I initially thought that the issue was related to linking, but for me it 
doesn't explain why I can link without "repeated" but can't link with it.

-- 
You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to protobuf+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/protobuf/035ec0f4-a4fc-4131-b9fc-b97c6a682dfan%40googlegroups.com.