Commits

ken...@google.com@630680e5-0e50-0410-840e-4b1c322b438d  committed 54e305f

Make DLLs work again.

  • Participants
  • Parent commits beea666

Comments (0)

Files changed (5)

File src/google/protobuf/lite_unittest.cc

     google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);
   }
 
-  cout << "PASS";
+  cout << "PASS" << endl;
   return 0;
 }

File src/google/protobuf/repeated_field.cc

   }
 }
 
-string* StringTypeHandler::New() {
+string* StringTypeHandlerBase::New() {
   return new string;
 }
-void StringTypeHandler::Delete(string* value) {
+void StringTypeHandlerBase::Delete(string* value) {
   delete value;
 }
 

File src/google/protobuf/repeated_field.h

   to->CheckTypeAndMergeFrom(from);
 }
 
-class LIBPROTOBUF_EXPORT StringTypeHandler {
+// HACK:  If a class is declared as DLL-exported in MSVC, it insists on
+//   generating copies of all its methods -- even inline ones -- to include
+//   in the DLL.  But SpaceUsed() calls StringSpaceUsedExcludingSelf() which
+//   isn't in the lite library, therefore the lite library cannot link if
+//   StringTypeHandler is exported.  So, we factor out StringTypeHandlerBase,
+//   export that, then make StringTypeHandler be a subclass which is NOT
+//   exported.
+// TODO(kenton):  There has to be a better way.
+class LIBPROTOBUF_EXPORT StringTypeHandlerBase {
  public:
   typedef string Type;
   static string* New();
   static void Delete(string* value);
   static void Clear(string* value) { value->clear(); }
   static void Merge(const string& from, string* to) { *to = from; }
+};
+
+class StringTypeHandler : public StringTypeHandlerBase {
+ public:
   static int SpaceUsed(const string& value)  {
     return sizeof(value) + StringSpaceUsedExcludingSelf(value);
   }
 };
 
-
 }  // namespace internal
 
 // RepeatedPtrField is like RepeatedField, but used for repeated strings or

File src/google/protobuf/wire_format_lite.cc

 #include <google/protobuf/io/coded_stream.h>
 #include <google/protobuf/io/zero_copy_stream.h>
 #include <google/protobuf/io/zero_copy_stream_impl.h>
-#include <google/protobuf/unknown_field_set.h>
 
 namespace google {
 namespace protobuf {

File vsprojects/readme.txt

 do the following:
 
   1) Open protobuf.sln in MSVC.
-  2) For each of the projects libprotobuf and libprotoc, do the following:
+  2) For each of the projects libprotobuf, libprotobuf-lite, and libprotoc, do
+     the following:
     2a) Right-click the project and choose "properties".
     2b) From the side bar, choose "General", under "Configuration Properties".
     2c) Change the "Configuration Type" to "Dynamic Library (.dll)".