Make DLLs work again.

pull/3335/head
kenton@google.com 16 years ago
parent e6607e3963
commit 9270a99d2e
  1. 2
      src/google/protobuf/lite_unittest.cc
  2. 4
      src/google/protobuf/repeated_field.cc
  3. 15
      src/google/protobuf/repeated_field.h
  4. 1
      src/google/protobuf/wire_format_lite.cc
  5. 3
      vsprojects/readme.txt

@ -107,6 +107,6 @@ int main(int argc, char* argv[]) {
google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message);
}
cout << "PASS";
cout << "PASS" << endl;
return 0;
}

@ -69,10 +69,10 @@ void RepeatedPtrFieldBase::Swap(RepeatedPtrFieldBase* other) {
}
}
string* StringTypeHandler::New() {
string* StringTypeHandlerBase::New() {
return new string;
}
void StringTypeHandler::Delete(string* value) {
void StringTypeHandlerBase::Delete(string* value) {
delete value;
}

@ -262,19 +262,30 @@ inline void GenericTypeHandler<MessageLite>::Merge(
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

@ -42,7 +42,6 @@
#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 {

@ -36,7 +36,8 @@ build libprotobuf and libprotoc as DLLs if you really want. To do this,
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)".

Loading…
Cancel
Save