Sto utilizzando il modulo FindProtobuf in un progetto in cui i file del buffer del protocollo si trovano in una sottodirectory. Voglio che il file CMakeLists.txt in quella sottodirectory invochi protoc per generare i file CPP. Il mio progetto struttura di cartelle è come questo:CMake e FindProtobuf
cammy/CMakeLists.txt # Root CMakeLists.txt
cammy/protofiles/test.proto # protofile
cammy/protofiles/CMakeLists.txt
ho la comprendono (FindProtobuf), l'invocazione find_package e la chiamata alla PROTOBUF_GENERATE_CPP nel file CMakeLists.txt nella cartella protobuf.
Il passaggio di generazione eseguibile è nel file Root CMakeLists.txt e aggiungere i file generati al file eseguibile di destinazione in questo file es.
add_executable(${EXEC} ${SRCS} ${PROTO_SRC} ${PROTO_HEADER})
target_link_libraries(${EXEC} ${PROTOBUF_LIBRARIES})
sono entrambe definite nella radice CMakeLists.txt
Quando corro cmake, non viene eseguito ProtoC generare file sorgente anche se expilicitly legare fonti generati all'eseguibile creando così una dipendenza.
Quando si spostano tutti i contenuti di CMakeLists.txt nella cartella protofiles nella radice CMakeLists.txt, i file di proto vengono compilati.
Qualcuno può aiutarmi con questo? Voglio che tutto il protocollo di costruzione del buffer vada nel file CMakeLists.txt creato nella cartella protofiles.
Ho anche notato che le variabili generate nel CMakeLists.txt interno (come PROTO_SRC) sono definite nel file interno quando stampate (cioè ottengo il nome file CPP generato correttamente) ma quando stampo la stessa variabile nel file radice. . è vuoto. È quasi come se avessi bisogno di "esportare" (se ci fosse un modo in cmake) le variabili nella cartella radice.
Qualsiasi aiuto sarebbe molto apprezzato.
Grazie Kartik
Grazie per chiarire le cose. Per riassumere, ho ragione nel dire che il motivo per cui la proto compilazione nidificata non funziona è perché le variabili generate non sono nello scope della torre? Inoltre, è possibile contrassegnare il flag GENERATO quando impostiamo le variabili dell'ambito genitore da quelle locali invece di doverlo fare nel file root? Infine, un approccio alternativo potrebbe essere quello di costruire il materiale di protobuf come libreria e collegarlo semplicemente all'eseguibile di root? –
@KartikAiyer Non si sa cosa significhi "non nell'ambito della torre", ma se "non è nell'ambito di CMakeLists.txt di livello superiore", allora sì. Per Q2, no - per quanto ne so non c'è modo di impostare le proprietà sui file che sono definiti nell'ambito genitore. Per il terzo trimestre, sì, credo che sarebbe un buon approccio. – Fraser
@Fraser ti ringrazio per la risposta, ho una domanda simile, aggiusto il progetto e ancora non funziona, è possibile che mi dia più suggerimenti? ref: http://stackoverflow.com/questions/29720410/no-member-found-when-use-cmake-construct-proto, progetto di esempio: https://github.com/yuikns/cmake-proto –