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.