Я использую модуль FindProtobuf в проекте, где файлы буфера протокола находятся в подкаталоге. Я хочу, чтобы файл CMakeLists.txt в этом подкаталоге вызывал protoc для создания файлов CPP. Моя структура папок проекта выглядит так:CMake и FindProtobuf
cammy/CMakeLists.txt # Root CMakeLists.txt
cammy/protofiles/test.proto # protofile
cammy/protofiles/CMakeLists.txt
У меня есть включают (FindProtobuf), то find_package вызов и вызов PROTOBUF_GENERATE_CPP в файле CMakeLists.txt в папке Protobuf.
Выполняемый шаг сборки находится в файле Root CMakeLists.txt, и я добавляю сгенерированные файлы в целевой исполняемый файл в этом файле т.е.
add_executable(${EXEC} ${SRCS} ${PROTO_SRC} ${PROTO_HEADER})
target_link_libraries(${EXEC} ${PROTOBUF_LIBRARIES})
оба определены в корне CMakeLists.txt
Когда я бегу CMake, он не работает protoc генерировать исходные файлы, даже если я expilicitly связать сгенерированные источники исполняемый файл, таким образом, создавая зависимость.
Когда я перемещаю все содержимое CMakeLists.txt в папке protofiles в корневой CMakeLists.txt, файлы proto скомпилируются.
Может ли кто-нибудь помочь мне с этим? Я хочу, чтобы все материалы для создания буфера протокола вошли в файл CMakeLists.txt, созданный в папке прототипов.
Я также заметил, что переменные, сгенерированные во внутреннем файле CMakeLists.txt (например, PROTO_SRC), определены во внутреннем файле при печати (т. Е. Я получаю правильное имя файла CPP), но когда я печатаю одну и ту же переменную в корневом файле. он пуст. Его почти как будто мне нужно «экспортировать» (если есть путь в cmake) переменные из корневой папки.
Любая помощь будет высоко оценена.
Благодаря Картик
Спасибо, что разобрался. Подводя итог, могу ли я сказать, что причина, по которой вложенная компиляция протона не работает, состоит в том, что генерируемые переменные не входят в сферу охвата ладьи? Кроме того, можно ли пометить флаг GENERATED, когда мы устанавливаем переменные родительской области видимости из локальных вместо того, чтобы делать это в корневом файле? Наконец, будет ли альтернативный подход состоять в том, чтобы собрать материал protobuf в виде библиотеки и просто связать его с корневым исполняемым файлом? –
@KartikAiyer Не уверен, что означает «не в области ладьи», но если это «не входит в объем CMakeLists.txt верхнего уровня», тогда да. Для Q2 нет - насколько я знаю, нет способа установить свойства для файлов, которые определены в родительской области. Для Q3, да, я считаю, что это был бы хороший подход. – Fraser
@ Спасибо вам за ваш ответ, у меня есть аналогичный вопрос, я настраиваю проект и все еще не работаю, возможно ли это дать мне больше предложений? ref: http://stackoverflow.com/questions/29720410/no-member-found-when-use-cmake-construct-proto, образец проекта: https://github.com/yuikns/cmake-proto –