Anonymous committed 54e305f

Make DLLs work again.

Comments (0)

Files changed (5)


-  cout << "PASS";
+  cout << "PASS" << endl;
   return 0;


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


-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 {
   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


 #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 {


 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)".