Próbuję użyć Protobuf w C++, ale mam problem z uzyskaniem tego, aby zrobił cokolwiek znaczącego. Używam Visual Studio 2015.Trudność przy korzystaniu z Protobuf 3.2 w C++
Zbudowałem protobuf library. Używam najnowszej wersji z github.
Stworzyłem plik .proto jako takie:
syntax = "proto3";
package Networking;
message Robot{
message KinematicLinkProto {
string name = 1;
float x_pos = 2;
float y_pos = 3;
float z_pos = 4;
float roll = 5;
float pitch = 6;
float yaw = 7;
float x_scale = 8;
float y_scale = 9;
float z_scale = 10;
}
repeated KinematicLinkProto links = 1;
}
skompilować to i spróbuj dodać go do projektu:
#include "Robot.pb.h"
int main(int argc, char **argv)
{
Networking::Robot robot_message;
return 0;
}
Moje linki łącznikowe libprotobuf.lib. Buduję go jako/MD, a libprotobuf jest zbudowany jako/MD.
Z jakiegoś powodu, to prosty program ma następujące dwa błędy linkera:
Error LNK2019 unresolved external symbol "private: static bool google::protobuf::io::CodedOutputStream::default_serialization_deterministic_" ([email protected]@[email protected]@[email protected]@0_NA) referenced in function "public: virtual unsigned char * __cdecl Networking::Robot::SerializeWithCachedSizesToArray(unsigned char *)const " ([email protected]@[email protected]@[email protected])
Error LNK2019 unresolved external symbol "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > google::protobuf::internal::fixed_address_empty_string" ([email protected]@[email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@[email protected]) referenced in function "protected: void __cdecl google::protobuf::internal::RepeatedPtrFieldBase::Clear<class google::protobuf::RepeatedPtrField<class Networking::Robot_KinematicLinkProto>::TypeHandler>(void)" ([email protected]@[email protected][email protected]@@@[email protected]@@@[email protected]@[email protected]@@IEAAXXZ)
Jestem bardzo mylić - jest to bardzo prosty program. Co mogłem robić źle?
EDYCJA: Kolega skompilowany proto 3001000. Ta wersja wydaje się działać. Ciekawi mnie, co z 3002000 łamie wszystko.
Są zarówno nagłówki i libprotobuf.lib od wersji 3.2? A może któryś z nich jest starszy? (Musisz użyć dokładnie tej samej wersji.) Czy libprotobuf.lib jest skompilowany z tymi samymi flagami kompilatora MSVC, np. debugowanie vs. release, static vs. dll, single-threaded vs. multi-threaded? Flagi muszą pasować do biblioteki i aplikacji. –
Cześć Kenton, tak, zarówno nagłówki, jak i libprotobuf pochodzą z projektu, który zbudowałem. libprotobuf jest również skompilowany z tymi samymi flagami. – user650261
Nie mogę odtworzyć problemu z dokładnym kodem i programem Visual Studio 2015. Proponuję odbudować bibliotekę libprotobuf.lib z najnowszymi źródłami (dostałem ją tutaj https://github.com/google/protobuf/releases/tag/v3. 2.0), po tym: https://github.com/google/protobuf/blob/master/cmake/README.md (jeśli używasz cmake do zbudowania pliku .sln, upewnij się, że zbudowałeś plik .sln, który pasuje do twojej wersji Visual Studio, niekoniecznie "Visual Studio 12 2013" jak to, co jest w readme. Użyłem "Visual Studio 14 2015"). Działa z/MD lub/MT (jeśli libprotobuf jest odpowiednio skompilowany) –