Ich verwende das FindProtobuf-Modul in einem Projekt, in dem sich die Protokollpufferdateien in einem Unterverzeichnis befinden. Ich möchte die Datei CMakeLists.txt in diesem Unterverzeichnis aufrufen, um die CPP-Dateien zu generieren. Mein Projekt Ordnerstruktur ist wie folgt:CMake und FindProtobuf
cammy/CMakeLists.txt # Root CMakeLists.txt
cammy/protofiles/test.proto # protofile
cammy/protofiles/CMakeLists.txt
Ich habe die umfassen (FindProtobuf), der find_package Aufruf und der Aufruf von PROTOBUF_GENERATE_CPP in der CMakeLists.txt Datei in protobuf Ordner.
Der ausführbare Build-Schritt befindet sich in der Root CMakeLists.txt-Datei, und ich füge die generierten Dateien der ausführbaren Zieldatei in dieser Datei IEEE hinzu.
add_executable(${EXEC} ${SRCS} ${PROTO_SRC} ${PROTO_HEADER})
target_link_libraries(${EXEC} ${PROTOBUF_LIBRARIES})
sind beide in der Wurzel definiert CMakeLists.txt
Wenn ich Cmake laufen, ist es nicht Protoc laufen die Quelle zu generieren Dateien, obwohl ich expilicitly auf die ausführbare Datei erzeugt Quellen binden, wodurch eine Abhängigkeit zu schaffen.
Wenn ich den gesamten Inhalt von CMakeLists.txt im Protofiles-Ordner in den Stamm CMakeLists.txt verschiebe, werden die Proto-Dateien kompiliert.
Kann mir jemand dabei helfen? Ich möchte, dass alle Sachen, die den Protokollpuffer aufbauen, in die Datei CMakeLists.txt gehen, die im Ordner protofiles erstellt wurde.
Ich habe auch festgestellt, dass Variablen in der inneren CMakeLists.txt (wie PROTO_SRC) in der inneren Datei beim Drucken (dh ich bekomme den korrekten CPP-Dateinamen erzeugt) definiert, aber wenn ich die gleiche Variable in der Root-Datei drucken. . es ist leer. Es ist fast so, als ob ich die Variablen in den Wurzelordner "exportieren" müsste (wenn es einen Weg in cmake gäbe).
Jede Hilfe würde sehr geschätzt werden.
Dank Kartik
Danke für die Klärung der Dinge. Zusammenfassend kann ich sagen, dass der Grund, warum das verschachtelte Proto-Kompilieren nicht funktioniert, darin liegt, dass die generierten Variablen nicht im Bereich des Turms liegen? Ist es auch möglich, das GENERATED-Flag zu markieren, wenn wir die Variablen für den übergeordneten Bereich von den lokalen Variablen aus setzen, anstatt es in der Root-Datei zu tun? Schließlich wäre es ein alternativer Ansatz, den protobuf stuff als eine Bibliothek zu erstellen und einfach mit der ausführbaren root-Datei zu verknüpfen. –
@KartikAiyer Nicht sicher, was "nicht im Bereich des Turmes" bedeutet, aber wenn es "nicht im Bereich der Top-Level CMakeLists.txt" ist, dann ja. Für Q2, nein - meines Wissens gibt es keine Möglichkeit, Eigenschaften für Dateien festzulegen, die im übergeordneten Bereich definiert sind. Für Q3, ja - ich denke, das wäre ein guter Ansatz. – Fraser
@Fraser danke für Ihre Antwort, ich habe eine ähnliche Frage, ich das Projekt anpassen und immer noch nicht arbeiten, ist es möglich, dass mir mehr Anregung geben? ref: http://stackoverflow.com/questions/29720410/no-member-found-when-use-cmake-construct-proto, Beispielprojekt: https://github.com/yuikns/cmake-proto –