diff options
author | Peter Kasting <pkasting@google.com> | 2015-08-27 14:30:28 -0700 |
---|---|---|
committer | Peter Kasting <pkasting@google.com> | 2015-08-27 14:30:28 -0700 |
commit | 6e54999773a4b2c655dedc58f7ccfa69ab5beff4 (patch) | |
tree | f34a51aff7a5d55e972e5527630353dfaef2113f | |
parent | c7a1f8ec3b7ab4f6763e4d5c2663ad39e13a6aa0 (diff) | |
download | protobuf-6e54999773a4b2c655dedc58f7ccfa69ab5beff4.tar.gz protobuf-6e54999773a4b2c655dedc58f7ccfa69ab5beff4.tar.bz2 protobuf-6e54999773a4b2c655dedc58f7ccfa69ab5beff4.zip |
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.
-rw-r--r-- | BUILD | 1 | ||||
-rw-r--r-- | cmake/libprotobuf-lite.cmake | 1 | ||||
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/google/protobuf/metadata.cc | 42 | ||||
-rw-r--r-- | src/google/protobuf/metadata.h | 3 |
5 files changed, 46 insertions, 2 deletions
@@ -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 e323840a..5a09f005 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 584bcd21..3019bc31 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 00000000..d30a7670 --- /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 <google/protobuf/metadata.h> + +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 c5bab0a8..db647300 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) { |