c++ - Protobuf cannot be linked on ubuntu -
i try use protobuf somehow linking fails (here snippet):
linking cxx executable app cmakefiles/app.dir/msg.pb.cc.o: in function `evoswarm::protobuf_assigndesc_a_5fto_5fb_2eproto()': msg.pb.cc:(.text+0x133): undefined reference `google::protobuf::internal::generatedmessagereflection::newgeneratedmessagereflection(google::protobuf::descriptor const*, google::protobuf::message const*, int const*, int, int, int, int, int, int)' msg.pb.cc:(.text+0x190): undefined reference `google::protobuf::internal::generatedmessagereflection::newgeneratedmessagereflection(google::protobuf::descriptor const*, google::protobuf::message const*, int const*, int, int, int, int, int, int)'
cmake finds shared object file of protobuf , uses during linking:
/usr/bin/c++ -std=c++11 cmakefiles/app.dir/main.cpp.o cmakefiles/app.dir/msg.pb.cc.o -o app -rdynamic -lprotobuf -lpthread
and here smaller version of cmakelists.txt
cmake_minimum_required (version 2.8) project(app) # build protobufs find_package(protobuf required) include_directories(${protobuf_include_dirs}) file(glob protofiles "${cmake_current_source_dir}/messages/*.proto") protobuf_generate_cpp(protosources protoheaders ${protofiles}) include_directories(${cmake_current_binary_dir}) # that's generated stuff ends set(cmake_cxx_flags "${cmake_cxx_flags} -std=c++11 ") #files main binary set(src main.cpp) add_executable (app ${src} ${protosources} ${protoheaders}) target_link_libraries (app ${protobuf_libraries})
at first installed library via source (was not working either), removed again , installed ubuntu package libprobofuv-dev , protobuf-compiler. output of dpkg -l libprotobuf-dev here:
> sudo dpkg -l libprotobuf-dev /. /usr /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/pkgconfig /usr/lib/x86_64-linux-gnu/pkgconfig/protobuf-lite.pc /usr/lib/x86_64-linux-gnu/pkgconfig/protobuf.pc /usr/lib/x86_64-linux-gnu/libprotobuf-lite.a /usr/lib/x86_64-linux-gnu/libprotobuf.a /usr/include /usr/include/google /usr/include/google/protobuf /usr/include/google/protobuf/dynamic_message.h /usr/include/google/protobuf/generated_enum_reflection.h /usr/include/google/protobuf/generated_message_reflection.h /usr/include/google/protobuf/wire_format.h /usr/include/google/protobuf/service.h /usr/include/google/protobuf/io /usr/include/google/protobuf/io/printer.h /usr/include/google/protobuf/io/coded_stream.h /usr/include/google/protobuf/io/tokenizer.h /usr/include/google/protobuf/io/zero_copy_stream_impl_lite.h /usr/include/google/protobuf/io/zero_copy_stream.h /usr/include/google/protobuf/io/gzip_stream.h /usr/include/google/protobuf/io/zero_copy_stream_impl.h /usr/include/google/protobuf/reflection_ops.h /usr/include/google/protobuf/extension_set.h /usr/include/google/protobuf/descriptor.h /usr/include/google/protobuf/generated_message_util.h /usr/include/google/protobuf/wire_format_lite_inl.h /usr/include/google/protobuf/stubs /usr/include/google/protobuf/stubs/atomicops_internals_pnacl.h /usr/include/google/protobuf/stubs/type_traits.h /usr/include/google/protobuf/stubs/atomicops_internals_x86_msvc.h /usr/include/google/protobuf/stubs/atomicops_internals_arm_gcc.h /usr/include/google/protobuf/stubs/platform_macros.h /usr/include/google/protobuf/stubs/once.h /usr/include/google/protobuf/stubs/atomicops_internals_x86_gcc.h /usr/include/google/protobuf/stubs/atomicops.h /usr/include/google/protobuf/stubs/atomicops_internals_generic_gcc.h /usr/include/google/protobuf/stubs/atomicops_internals_atomicword_compat.h /usr/include/google/protobuf/stubs/common.h /usr/include/google/protobuf/stubs/atomicops_internals_arm_qnx.h /usr/include/google/protobuf/stubs/atomicops_internals_mips_gcc.h /usr/include/google/protobuf/stubs/template_util.h /usr/include/google/protobuf/stubs/atomicops_internals_macosx.h /usr/include/google/protobuf/message_lite.h /usr/include/google/protobuf/text_format.h /usr/include/google/protobuf/descriptor_database.h /usr/include/google/protobuf/descriptor.proto /usr/include/google/protobuf/message.h /usr/include/google/protobuf/repeated_field.h /usr/include/google/protobuf/wire_format_lite.h /usr/include/google/protobuf/unknown_field_set.h /usr/include/google/protobuf/descriptor.pb.h /usr/share /usr/share/doc /usr/lib/x86_64-linux-gnu/libprotobuf-lite.so /usr/lib/x86_64-linux-gnu/libprotobuf.so /usr/share/doc/libprotobuf-dev
as @frymode pointet out in comment, linkage newgeneratedmessagereflection means compiler generated code uses protobuf version 3 (as used version in .proto files). however, library files installed ubuntu package pulled version 2 onto system, that's why methods not found.
solution remove again , build protobuf including protoc source.
Comments
Post a Comment