2017-03-14 14 views
5

Protobuf'u C++' da kullanmaya çalışıyorum, ancak anlamlı bir şey yapmakta zorluk çekiyorum. Visual Studio 2015 kullanıyorum. protobuf'u oluşturdum. En son sürümü github'dan kullanıyorum. Ben gibi bir .proto dosyası oluşturdukC++ 'da Protobuf 3.2 kullanma zorluğu

:

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; 

} 

Bunu derlemek ve bir projeye eklemek için deneyin:

#include "Robot.pb.h" 



int main(int argc, char **argv) 
{ 

    Networking::Robot robot_message; 

    return 0; 

} 

Benim bağlayıcı bağlantılar libprotobuf.lib./MD olarak yapıyorum ve libprotobuf/MD olarak oluşturuldu. Nedense

, bu basit programı aşağıdaki iki bağlayıcı hatalar var:

Çok kafam karıştı
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) 

- bu çok basit bir programdır. Ne yanlış yapabilirdim ki?

DÜZENLEME: Bir iş arkadaşı proto 3001000'i derledi. Bu sürüm işe yaramıyor gibi görünüyor. 3002000'in herşeyi nasıl kırdığını merak ediyorum.

+0

kullanmak sürüm 3.2 başlıklarını ve libprotobuf.lib hem musunuz? Yoksa bunlardan biri daha yaşlı olabilir mi? (Tam olarak aynı sürümü kullanmanız gerekir.) Libprotobuf.lib, aynı MSVC derleyici bayrakları ile derlenmiştir, örn. hata ayıklama vs serbest bırakma, statik vs dll, tek iş parçacıklı ve çok iş parçacıklı? Bayrakların kütüphane ve uygulamanız arasında eşleşmesi gerekir. –

+0

Merhaba Kenton, Evet, hem başlıklar hem de libprotobuf inşa ettiğim projeden geliyor. libprotobuf aynı bayraklarla da derlenmiştir. – user650261

+0

Sorunu tam kodunuzla ve Visual Studio 2015 ile yeniden oluşturamıyorum. En son kaynaklarla libprotobuf.lib dosyasını yeniden oluşturmanızı öneriyorum (https://github.com/google/protobuf/releases/tag/v3 adresinde burayı satın aldım). 2.0), bunu takiben: https://github.com/google/protobuf/blob/master/cmake/README.md (bir .sln oluşturmak için cmake kullanırsanız, sürümünüzle eşleşen .sln'yi oluşturduğunuzdan emin olun. Visual Studio, zorunlu olarak 'Visual Studio 12 2013' değil, readme'da olduğu gibi 'Visual Studio 14 2015' kullanıyorum./MD veya/MT ile çalışması (eğer libprotobuf buna göre derlenmişse) –

cevap

2

DLL kullanıyorsanız,

#define PROTOBUF_USE_DLLS