2017-11-14 1 views
0

Ich habe erfolgreich in der Lage gewesen Puffer Klassen von Proto-Dateien zu generieren, die mit diesem Befehl:ld.exe nicht finden kann -lprotobuf für Protobuf 3.4.0

$ protoc --cpp_out=%CD% addressbook.proto 

Dies funktioniert und erzeugt Puffer Klassen addressbook.pb.h und addressbook.pb.cc Dateien .

Jetzt, wenn ich eine Anwendung schreiben, um diese Pufferklassen zu verwenden, erhalte ich Linker-Fehler. Ich habe versucht ein paar verschiedene Möglichkeiten:

Wie in der shipped example’s Makefile und in Online-doc:

pkg-config --cflags protobuf 

g++ myApplication.cc addressbook.pb.cc `pkg-config --cflags --libs protobuf` 

<Fails with linker errors.> 

Auch nur in die examples directory gehen, und:

make cpp 

mit fehlschlägt,

c++ add_person.cc addressbook.pb.cc -o add_person_cpp `pkg-config --cflags --libs protobuf` 
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot find -lprotobuf 
collect2.exe: error: ld returned 1 exit status 
make: *** [add_person_cpp] Error 1 

Ich bin sicher, dass pkg-config korrekt eingestellt ist, weil:

$ pkg-config --cflags protobuf 

-Isomepath/install/include 

Und

$ pkg-config --libs protobuf 
-Lsomepath/install/lib/ -llibprotobuf 

Dann wird, wie here vorgeschlagen, habe ich versucht:

g++ -I somepath/install/include -L somepath/install/lib add_person.cc addressbook.pb.cc -lprotobuf 

c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot find -lprotobuf 
collect2.exe: error: ld returned 1 exit status 
make: *** [cpp] Error 1 

und

g++ -I somepath/install/include -L somepath/install/lib add_person.cc addressbook.pb.cc -llibprotobuf 

Fails with linker errors. 
… 
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text+0x2bb): undefined reference to `google::protobuf::internal::VerifyVersion(int, int, char const*)' 
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text+0x3b1): undefined reference to `google::protobuf::Message::ParseFromIstream(std::istream*)' 
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text+0x475): undefined reference to `google::protobuf::Message::SerializeToOstream(std::ostream*) const' 
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text+0x4cd): undefined reference to `google::protobuf::ShutdownProtobufLibrary()' 
C:\Users\usrname\AppData\Local\Temp\ccjC2zi3.o:add_person.cc:(.text$_ZNK6google8protobuf5Arena9AllocHookEPKSt9type_infoj[__ZNK6google8protobuf5Arena9AllocHookEPKSt9type_infoj]+0x2e): undefined reference to `google::protobuf::Arena::OnArenaAllocation(std::type_info const*, unsigned int) const' 
… [ a few hundred lines ] 

ich die obigen Beispiele wiederholt nach der Ausführung

set LD_LIBRARY_PATH=somepath\install\lib 

ich sicher, dass die Umgebungsvariable in Fenster Systemeinstellungen auf das Verzeichnis verweisen, das libprotobuf.lib enthält (warum hat der erzeugte pkgconfig Ordner in diesem Ordner lib hat protobuf.pc), die diese Zeilen enthält:

libdir=somepath/install/lib 
Libs: -L${libdir} -lprotobuf 

Sollte dies nicht

Libs: -L${libdir} -llibprotobuf 

noch sein, nachdem die LD_LIBRARY_PATH gleichen Fehler zu setzen. Ich habe versucht mit g ++ v4.9.2 und v6.3.0 und MSVC 2013, 2015, 2017 (mit cl statt g ++).

Eine andere Sache, die ich ausprobiert habe, war, die libprotobuf.lib in MiGW/bin zu platzieren und zu denken, dass g ++ es finden wird, aber es hat nicht geholfen.

Irgendwelche Ideen, warum g ++/MSVC diese Bibliotheken nicht finden kann oder wenn ich etwas falsch mache?

  • Alle Tests bestanden, als ich nmake check nach der Installation lief wie in README vorgeschlagen.
  • Ich deinstalliert und neu installiert v3.4.0 und v3.5.0 und beide haben das gleiche Verhalten.

Antwort

1

Haben Sie protobuf-Bibliotheken für Microsoft Windows mit MSVC erstellt? Sie sollten nicht erwarten, dass MinGW mit einer statischen Bibliothek arbeitet, die mit MSVC erstellt wurde.

Um Ihr Beispiel unter Microsoft Windows zu verknüpfen könnten Sie schreiben:

cl -I somepath\install\include somepath\install\lib\libprotobuf.lib add_person.cc addressbook.pb.cc 

Der Compiler ‚cl‘ Dateityp ‚Lib‘ sehen und ‚libprotobuf.lib‘ als Bibliothek handhaben.

Verwandte Themen