From 6e54999773a4b2c655dedc58f7ccfa69ab5beff4 Mon Sep 17 00:00:00 2001 From: Peter Kasting Date: Thu, 27 Aug 2015 14:30:28 -0700 Subject: [PATCH 1/2] Fix compile failures building protobuf DLLs on MSVC in Chromium's codebase. When trying to compile the protobuf code as a DLL, and then compile other DLLs with generated .pb.cc/h files that reference InternalMetadataWithArena::InternalMetadataWithArena(Arena*), MSVC gives an "unresolved external symbol" error. This seems to be due to the function being simultaneously exported and inline. Moving it out-of-line fixes things. There are other functions exported and inline as well but de-inlining them doesn't seem to be necessary to get the build working, and I'd rather de-inline as few functions as possible. --- BUILD | 1 + cmake/libprotobuf-lite.cmake | 1 + src/Makefile.am | 1 + src/google/protobuf/metadata.cc | 42 +++++++++++++++++++++++++++++++++ src/google/protobuf/metadata.h | 3 +-- 5 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/google/protobuf/metadata.cc diff --git a/BUILD b/BUILD index 5cfed337e67d2..aeae77b8c3baf 100644 --- a/BUILD +++ b/BUILD @@ -30,6 +30,7 @@ cc_library( "src/google/protobuf/io/zero_copy_stream.cc", "src/google/protobuf/io/zero_copy_stream_impl_lite.cc", "src/google/protobuf/message_lite.cc", + "src/google/protobuf/metadata.cc", "src/google/protobuf/repeated_field.cc", "src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc", "src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc", diff --git a/cmake/libprotobuf-lite.cmake b/cmake/libprotobuf-lite.cmake index e323840a17422..5a09f005281ab 100644 --- a/cmake/libprotobuf-lite.cmake +++ b/cmake/libprotobuf-lite.cmake @@ -7,6 +7,7 @@ set(libprotobuf_lite_files ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream.cc ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream_impl_lite.cc ${protobuf_source_dir}/src/google/protobuf/message_lite.cc + ${protobuf_source_dir}/src/google/protobuf/metadata.cc ${protobuf_source_dir}/src/google/protobuf/repeated_field.cc ${protobuf_source_dir}/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc ${protobuf_source_dir}/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc diff --git a/src/Makefile.am b/src/Makefile.am index 584bcd21deeb9..3019bc311dd9c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -196,6 +196,7 @@ libprotobuf_lite_la_SOURCES = \ google/protobuf/extension_set.cc \ google/protobuf/generated_message_util.cc \ google/protobuf/message_lite.cc \ + google/protobuf/metadata.cc \ google/protobuf/repeated_field.cc \ google/protobuf/wire_format_lite.cc \ google/protobuf/io/coded_stream.cc \ diff --git a/src/google/protobuf/metadata.cc b/src/google/protobuf/metadata.cc new file mode 100644 index 0000000000000..d30a767041f9f --- /dev/null +++ b/src/google/protobuf/metadata.cc @@ -0,0 +1,42 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2015 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +namespace google { +namespace protobuf { +namespace internal { + +InternalMetadataWithArena::InternalMetadataWithArena(Arena* arena) + : ptr_(arena) {} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/src/google/protobuf/metadata.h b/src/google/protobuf/metadata.h index c5bab0a8debdc..db647300e4a29 100644 --- a/src/google/protobuf/metadata.h +++ b/src/google/protobuf/metadata.h @@ -59,8 +59,7 @@ namespace internal { class LIBPROTOBUF_EXPORT InternalMetadataWithArena { public: InternalMetadataWithArena() : ptr_(NULL) {} - explicit InternalMetadataWithArena(Arena* arena) - : ptr_ (arena) {} + explicit InternalMetadataWithArena(Arena* arena); ~InternalMetadataWithArena() { if (have_unknown_fields() && arena() == NULL) { From 5d412c47d97fd753ec8ed560ddd276f65cf34de0 Mon Sep 17 00:00:00 2001 From: Peter Kasting Date: Thu, 27 Aug 2015 15:42:03 -0700 Subject: [PATCH 2/2] Change to just not marking the class for export --- BUILD | 1 - cmake/libprotobuf-lite.cmake | 1 - src/Makefile.am | 1 - src/google/protobuf/metadata.cc | 42 --------------------------------- src/google/protobuf/metadata.h | 5 ++-- 5 files changed, 3 insertions(+), 47 deletions(-) delete mode 100644 src/google/protobuf/metadata.cc diff --git a/BUILD b/BUILD index aeae77b8c3baf..5cfed337e67d2 100644 --- a/BUILD +++ b/BUILD @@ -30,7 +30,6 @@ cc_library( "src/google/protobuf/io/zero_copy_stream.cc", "src/google/protobuf/io/zero_copy_stream_impl_lite.cc", "src/google/protobuf/message_lite.cc", - "src/google/protobuf/metadata.cc", "src/google/protobuf/repeated_field.cc", "src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc", "src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc", diff --git a/cmake/libprotobuf-lite.cmake b/cmake/libprotobuf-lite.cmake index 5a09f005281ab..e323840a17422 100644 --- a/cmake/libprotobuf-lite.cmake +++ b/cmake/libprotobuf-lite.cmake @@ -7,7 +7,6 @@ set(libprotobuf_lite_files ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream.cc ${protobuf_source_dir}/src/google/protobuf/io/zero_copy_stream_impl_lite.cc ${protobuf_source_dir}/src/google/protobuf/message_lite.cc - ${protobuf_source_dir}/src/google/protobuf/metadata.cc ${protobuf_source_dir}/src/google/protobuf/repeated_field.cc ${protobuf_source_dir}/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc ${protobuf_source_dir}/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc diff --git a/src/Makefile.am b/src/Makefile.am index 3019bc311dd9c..584bcd21deeb9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -196,7 +196,6 @@ libprotobuf_lite_la_SOURCES = \ google/protobuf/extension_set.cc \ google/protobuf/generated_message_util.cc \ google/protobuf/message_lite.cc \ - google/protobuf/metadata.cc \ google/protobuf/repeated_field.cc \ google/protobuf/wire_format_lite.cc \ google/protobuf/io/coded_stream.cc \ diff --git a/src/google/protobuf/metadata.cc b/src/google/protobuf/metadata.cc deleted file mode 100644 index d30a767041f9f..0000000000000 --- a/src/google/protobuf/metadata.cc +++ /dev/null @@ -1,42 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2015 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include - -namespace google { -namespace protobuf { -namespace internal { - -InternalMetadataWithArena::InternalMetadataWithArena(Arena* arena) - : ptr_(arena) {} - -} // namespace internal -} // namespace protobuf -} // namespace google diff --git a/src/google/protobuf/metadata.h b/src/google/protobuf/metadata.h index db647300e4a29..98c593dae6325 100644 --- a/src/google/protobuf/metadata.h +++ b/src/google/protobuf/metadata.h @@ -56,10 +56,11 @@ namespace internal { // The tagged pointer uses the LSB to disambiguate cases, and uses bit 0 == 0 to // indicate an arena pointer and bit 0 == 1 to indicate a UFS+Arena-container // pointer. -class LIBPROTOBUF_EXPORT InternalMetadataWithArena { +class InternalMetadataWithArena { public: InternalMetadataWithArena() : ptr_(NULL) {} - explicit InternalMetadataWithArena(Arena* arena); + explicit InternalMetadataWithArena(Arena* arena) + : ptr_ (arena) {} ~InternalMetadataWithArena() { if (have_unknown_fields() && arena() == NULL) {