Protocol Buffers im Qt-Projekt verwenden

Alles zu Entwicklungsumgebungen und Editoren für Qt
Antworten
Madergona
Beiträge: 8
Registriert: 5. Juni 2017 22:05

Protocol Buffers im Qt-Projekt verwenden

Beitrag von Madergona » 14. Juni 2017 20:42

Hallo alle zusammen,

ich versuche aktuell ein Qt Projekt zu kompilieren, in dem ich u.a. auch Protocol Buffers von Google verwende.
Die notwendigen C++ Klassen wurden bereits vom protoc erstellt, es geht mir hier also NICHT darum,
wie ich die Qt IDE dazu bringe die .proto Daten zu kompilieren, sondern ausschließlich um das Inkludieren,
der nachher notwendigen Header.
Die aus der .proto Datei erstellten .pb.cc und .pb.h Dateien habe ich dem Projekt hinzugefügt.
Dort sind alle notwendigen Inkludierungen für die Bibliotheken.

Ich bekomme folgenden Fehler:
/Users/User/Documents/Projekt/Projekt/file.pb.h:9: Fehler: 'google/protobuf/stubs/common.h' file not found
#include <google/protobuf/stubs/common.h>
^

Einen Pfad habe ich in der .pro Datei angegeben über:
INCLUDEPATH += -L /usr/local/include/google/protobuf

Dort sind auch sämtliche notwendige Header gespeichert.

Verwendet wird als Betriebssystem Mac OS Sierra .

Wie muss ich meine .pro Datei anpassen, damit dieser Fehler nicht mehr auftritt?

Vielen Dank für die Hilfe!

Christian81
Beiträge: 7313
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Protocol Buffers im Qt-Projekt verwenden

Beitrag von Christian81 » 15. Juni 2017 06:53

Wenn er nach ''google/protobuf/stubs/common.h' sucht, wird der Include-Pfad '/usr/local/include/google/protobuf' nicht helfen.
-> Include Pfad korrigieren und schon sollte es gehen
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

Madergona
Beiträge: 8
Registriert: 5. Juni 2017 22:05

Re: Protocol Buffers im Qt-Projekt verwenden

Beitrag von Madergona » 16. Juni 2017 20:10

Oh weiaaa ... Ja, das macht natürlich Sinn.

Jetzt findet er zwar alle notwendigen Bibliotheken, aber ich bekomme einen Haufen an Warnings ausgeworfen:
[img]Bildschirmfoto.png[/img]

Kann damit zufällig jemand was anfangen?

Gruß und schönes Wochenende
Dateianhänge
Bildschirmfoto.png
Bildschirmfoto.png (168.19 KiB) 5274 mal betrachtet

Christian81
Beiträge: 7313
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Protocol Buffers im Qt-Projekt verwenden

Beitrag von Christian81 » 17. Juni 2017 11:59

Zeig mal die Compilerausgabe, nicht nur die Warnungen/Fehler. Dort steht ggf. mehr.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

Madergona
Beiträge: 8
Registriert: 5. Juni 2017 22:05

Re: Protocol Buffers im Qt-Projekt verwenden

Beitrag von Madergona » 17. Juni 2017 12:05

Hier mal ein Ausschnitt der Fehlerausgabe, den Rest habe ich weggelassen, da sich das Ganze nur wiederholt.

12:02:19: Führe Schritte für Projekt Karteikarten aus...
12:02:19: Unveränderte Konfiguration, qmake-Schritt wird übersprungen.
12:02:19: Starte "/usr/bin/make"
Makefile:753: warning: overriding commands for target `moc_mainwindow.cpp'
Makefile:738: warning: ignoring old commands for target `moc_mainwindow.cpp'
Makefile:911: warning: overriding commands for target `Karteikarte.pb.o'
Makefile:857: warning: ignoring old commands for target `Karteikarte.pb.o'
Makefile:926: warning: overriding commands for target `main.o'
Makefile:789: warning: ignoring old commands for target `main.o'
Makefile:940: warning: overriding commands for target `mainwindow.o'
Makefile:803: warning: ignoring old commands for target `mainwindow.o'
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -stdlib=libc++ -headerpad_max_install_names -arch x86_64 -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -mmacosx-version-min=10.10 -Wl,-rpath,@executable_path/Frameworks -Wl,-rpath,/Applications/Qt/5.9/clang_64/lib -o Karteikarten.app/Contents/MacOS/Karteikarten main.o mainwindow.o Karteikarte.pb.o Karteikarte.pb.o main.o mainwindow.o moc_mainwindow.o -F/Applications/Qt/5.9/clang_64/lib -framework QtWidgets -framework QtGui -framework QtCore -framework DiskArbitration -framework IOKit -framework OpenGL -framework AGL
Undefined symbols for architecture x86_64:
"google::protobuf::DescriptorPool::InternalAddGeneratedFile(void const*, int)", referenced from:
Karteikarten::protobuf_Karteikarte_2eproto::AddDescriptorsImpl() in Karteikarte.pb.o
Karteikarten::protobuf_Karteikarte_2eproto::AddDescriptorsImpl() in Karteikarte.pb.o
"google::protobuf::MessageFactory::InternalRegisterGeneratedFile(char const*, void (*)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&))", referenced from:
Karteikarten::protobuf_Karteikarte_2eproto::AddDescriptorsImpl() in Karteikarte.pb.o
Karteikarten::protobuf_Karteikarte_2eproto::AddDescriptorsImpl() in Karteikarte.pb.o
"google::protobuf::UnknownFieldSet::ClearFallback()", referenced from:
google::protobuf::UnknownFieldSet::Clear() in Karteikarte.pb.o
google::protobuf::UnknownFieldSet::Clear() in Karteikarte.pb.o
"google::protobuf::UnknownFieldSet::default_instance()", referenced from:
google::protobuf::internal::InternalMetadataWithArena::default_instance() in Karteikarte.pb.o
google::protobuf::internal::InternalMetadataWithArena::default_instance() in Karteikarte.pb.o
"google::protobuf::UnknownFieldSet::MergeFrom(google::protobuf::UnknownFieldSet const&)", referenced from:
google::protobuf::internal::InternalMetadataWithArena::DoMergeFrom(google::protobuf::UnknownFieldSet const&) in Karteikarte.pb.o
google::protobuf::internal::InternalMetadataWithArena::DoMergeFrom(google::protobuf::UnknownFieldSet const&) in Karteikarte.pb.o
"google::protobuf::GoogleOnceInitImpl(long*, google::protobuf::Closure*)", referenced from:
google::protobuf::GoogleOnceInit(long*, void (*)()) in Karteikarte.pb.o
google::protobuf::GoogleOnceInit(long*, void (*)()) in Karteikarte.pb.o
"google::protobuf::io::CodedInputStream::ReadTagFallback(unsigned int)", referenced from:
Karteikarten::Vorderseite::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*) in Karteikarte.pb.o
Karteikarten::Rueckseite::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*) in Karteikarte.pb.o
Karteikarten::Karteikarte::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*) in Karteikarte.pb.o
Karteikarten::Karteikarten::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*) in Karteikarte.pb.o
Karteikarten::Vorderseite::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*) in Karteikarte.pb.o
Karteikarten::Rueckseite::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*) in Karteikarte.pb.o
Karteikarten::Karteikarte::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*) in Karteikarte.pb.o
...
"google::protobuf::io::CodedInputStream::ReadVarintSizeAsIntFallback()", referenced from:
google::protobuf::io::CodedInputStream::ReadVarintSizeAsInt(int*) in Karteikarte.pb.o
google::protobuf::io::CodedInputStream::ReadVarintSizeAsInt(int*) in Karteikarte.pb.o
"google::protobuf::io::CodedInputStream::DecrementRecursionDepthAndPopLimit(int)", referenced from:
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Vorderseite>(google::protobuf::io::CodedInputStream*, Karteikarten::Vorderseite*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Rueckseite>(google::protobuf::io::CodedInputStream*, Karteikarten::Rueckseite*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Karteikarte>(google::protobuf::io::CodedInputStream*, Karteikarten::Karteikarte*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Vorderseite>(google::protobuf::io::CodedInputStream*, Karteikarten::Vorderseite*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Rueckseite>(google::protobuf::io::CodedInputStream*, Karteikarten::Rueckseite*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Karteikarte>(google::protobuf::io::CodedInputStream*, Karteikarten::Karteikarte*) in Karteikarte.pb.o
"google::protobuf::io::CodedInputStream::IncrementRecursionDepthAndPushLimit(int)", referenced from:
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Vorderseite>(google::protobuf::io::CodedInputStream*, Karteikarten::Vorderseite*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Rueckseite>(google::protobuf::io::CodedInputStream*, Karteikarten::Rueckseite*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Karteikarte>(google::protobuf::io::CodedInputStream*, Karteikarten::Karteikarte*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Vorderseite>(google::protobuf::io::CodedInputStream*, Karteikarten::Vorderseite*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Rueckseite>(google::protobuf::io::CodedInputStream*, Karteikarten::Rueckseite*) in Karteikarte.pb.o
bool google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual<Karteikarten::Karteikarte>(google::protobuf::io::CodedInputStream*, Karteikarten::Karteikarte*) in Karteikarte.pb.o
"google::protobuf::io::CodedOutputStream::WriteStringWithSizeToArray(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned char*)", referenced from:
google::protobuf::internal::WireFormatLite::WriteStringToArray(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned char*) in Karteikarte.pb.o
google::protobuf::internal::WireFormatLite::WriteStringToArray(int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned char*) in Karteikarte.pb.o
"google::protobuf::io::CodedOutputStream::default_serialization_deterministic_", referenced from:
google::protobuf::io::CodedOutputStream::IsDefaultSerializationDeterministic() in Karteikarte.pb.o
google::protobuf::io::CodedOutputStream::IsDefaultSerializationDeterministic() in Karteikarte.pb.o
"google::protobuf::Arena::AddListNode(void*, void (*)(void*))", referenced from:
void google::protobuf::Arena::Own<Karteikarten::Vorderseite>(Karteikarten::Vorderseite*) in Karteikarte.pb.o
void google::protobuf::Arena::Own<Karteikarten::Rueckseite>(Karteikarten::Rueckseite*) in Karteikarte.pb.o
void google::protobuf::Arena::Own<Karteikarten::Karteikarte>(Karteikarten::Karteikarte*) in Karteikarte.pb.o
void google::protobuf::Arena::Own<Karteikarten::Karteikarten>(Karteikarten::Karteikarten*) in Karteikarte.pb.o
google::protobuf::internal::InternalMetadataWithArenaBase<google::protobuf::UnknownFieldSet, google::protobuf::internal::InternalMetadataWithArena>::mutable_unknown_fields_slow() in Karteikarte.pb.o
void google::protobuf::Arena::Own<Karteikarten::Vorderseite>(Karteikarten::Vorderseite*) in Karteikarte.pb.o
void google::protobuf::Arena::Own<Karteikarten::Rueckseite>(Karteikarten::Rueckseite*) in Karteikarte.pb.o
...
"google::protobuf::Arena::AllocateAligned(std::type_info const*, unsigned long)", referenced from:
google::protobuf::internal::InternalMetadataWithArenaBase<google::protobuf::UnknownFieldSet, google::protobuf::internal::InternalMetadataWithArena>::mutable_unknown_fields_slow() in Karteikarte.pb.o
google::protobuf::internal::InternalMetadataWithArenaBase<google::protobuf::UnknownFieldSet, google::protobuf::internal::InternalMetadataWithArena>::mutable_unknown_fields_slow() in Karteikarte.pb.o
"google::protobuf::Message::DiscardUnknownFields()", referenced from:
vtable for Karteikarten::Vorderseite in Karteikarte.pb.o
vtable for Karteikarten::Rueckseite in Karteikarte.pb.o
vtable for Karteikarten::Karteikarte in Karteikarte.pb.o
vtable for Karteikarten::Karteikarten in Karteikarte.pb.o
vtable for Karteikarten::Vorderseite in Karteikarte.pb.o
vtable for Karteikarten::Rueckseite in Karteikarte.pb.o
vtable for Karteikarten::Karteikarte in Karteikarte.pb.o
...
"google::protobuf::Message::CheckTypeAndMergeFrom(google::protobuf::MessageLite const&)", referenced from:
vtable for Karteikarten::Vorderseite in Karteikarte.pb.o
vtable for Karteikarten::Rueckseite in Karteikarte.pb.o
vtable for Karteikarten::Karteikarte in Karteikarte.pb.o
vtable for Karteikarten::Karteikarten in Karteikarte.pb.o
vtable for Karteikarten::Vorderseite in Karteikarte.pb.o
vtable for Karteikarten::Rueckseite in Karteikarte.pb.o
vtable for Karteikarten::Karteikarte in Karteikarte.pb.o
...
"google::protobuf::internal::LogMessage::LogMessage(google::protobuf::LogLevel, char const*, int)", referenced from:
Karteikarten::Vorderseite::Clear() in Karteikarte.pb.o
Karteikarten::Vorderseite::MergeFrom(google::protobuf::Message const&) in Karteikarte.pb.o
Karteikarten::Vorderseite::MergeFrom(Karteikarten::Vorderseite const&) in Karteikarte.pb.o
Karteikarten::Rueckseite::Clear() in Karteikarte.pb.o
Karteikarten::Rueckseite::MergeFrom(google::protobuf::Message const&) in Karteikarte.pb.o
Karteikarten::Rueckseite::MergeFrom(Karteikarten::Rueckseite const&) in Karteikarte.pb.o
Karteikarten::Karteikarte::Clear() in Karteikarte.pb.o
...
"google::protobuf::internal::LogMessage::~LogMessage()", referenced from:
Karteikarten::Vorderseite::Clear() in Karteikarte.pb.o
Karteikarten::Vorderseite::MergeFrom(google::protobuf::Message const&) in Karteikarte.pb.o
Karteikarten::Vorderseite::MergeFrom(Karteikarten::Vorderseite const&) in Karteikarte.pb.o
Karteikarten::Rueckseite::Clear() in Karteikarte.pb.o
Karteikarten::Rueckseite::MergeFrom(google::protobuf::Message const&) in Karteikarte.pb.o
Karteikarten::Rueckseite::MergeFrom(Karteikarten::Rueckseite const&) in Karteikarte.pb.o
Karteikarten::Karteikarte::Clear() in Karteikarte.pb.o
...
"google::protobuf::internal::LogMessage::operator<<(char const*)", referenced from:
Karteikarten::Vorderseite::Clear() in Karteikarte.pb.o
Karteikarten::Vorderseite::MergeFrom(google::protobuf::Message const&) in Karteikarte.pb.o
Karteikarten::Vorderseite::MergeFrom(Karteikarten::Vorderseite const&) in Karteikarte.pb.o
Karteikarten::Rueckseite::Clear() in Karteikarte.pb.o
Karteikarten::Rueckseite::MergeFrom(google::protobuf::Message const&) in Karteikarte.pb.o
Karteikarten::Rueckseite::MergeFrom(Karteikarten::Rueckseite const&) in Karteikarte.pb.o
Karteikarten::Karteikarte::Clear() in Karteikarte.pb.o
...

Christian81
Beiträge: 7313
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Protocol Buffers im Qt-Projekt verwenden

Beitrag von Christian81 » 17. Juni 2017 15:15

Du musst natürlich auch noch gegen die Protobuf-Library linken.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

Madergona
Beiträge: 8
Registriert: 5. Juni 2017 22:05

Re: Protocol Buffers im Qt-Projekt verwenden

Beitrag von Madergona » 17. Juni 2017 15:53

Aber wie stelle ich das an?
Ich arbeite mit Protobuf immer nur auf der Konsole und nie in einer IDE.
Das ich Qt dementsprechend einstellen muss, ist mir bewusst ;-)

Christian81
Beiträge: 7313
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Protocol Buffers im Qt-Projekt verwenden

Beitrag von Christian81 » 17. Juni 2017 17:14

"LIBS += -lprotobuf" wenn die Library libprotobuf.so ist.
http://doc.qt.io/qt-5/qmake-variable-re ... .html#libs
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

Madergona
Beiträge: 8
Registriert: 5. Juni 2017 22:05

Re: Protocol Buffers im Qt-Projekt verwenden

Beitrag von Madergona » 17. Juni 2017 20:54

Hallo Christian, Danke für deine viele Hilfe! Ich habe die Fehler gefunden!

Ich hatte schon vorher versucht die Bibliothek zu Qt hinzuzufügen. Bin aber dabei gescheitert und habe den Thread hier aufgemacht.
Das Kernproblem lag nicht darin, wie ich versucht habe die Library zu inkludieren sondern darin, dass bei der Installation von
Protobuf etwas deftig schief gelaufen ist. Daher konnte Qt auch bei mir vorher schon keine Library finden.
Es werden zwar alle Ordner erstellt, aber keine libprotobuf.so sondern nur eine libprotobuf.a .
Nach stundenlangen versuchen habe ich nun folgende Probleme gefunden:

1. Protobuf 3.0.0.x ist nicht kompatibel mit MacOS Sierra --> Ich habe jetzt 3.3.0 genommen.

2. In der Installationsanleitung steht, dass man folgende Befehle ausführen soll:
$ sudo xcode-select --install
$ sudo /opt/local/bin/port install autoconf automake libtool
Das läuft bei mir auch erfolgreich durch und autoconf, etc. werden via Ports installiert. Allerdings steht dann in der Anleitung,
dass mit dann mit der Installation normal weiter fortfahren kann wie bei UNIX-Systemen. Ich scheitere schon an der ./autogen.sh

Ich hatte Protobuf vorher über HomeBrew installiert, dort traten die Fehler nicht auf, die Library wurde aber nicht richtig gebaut...

Da der Fehler offensichtlich nicht auf der Seite von Qt liegt, sondern auf der von ProtoBuf werde ich den Thread hier schließen.
Bei Interesse kann ich aber gerne die Lösung posten, sofern ich eine finde.

Gruß und schönes Wochenende
Madergona

Antworten