С использованием
find_package(Protobuf REQUIRED
PATHS ${PROTOBUF_SEARCH_PATH}
)
if (NOT ${Protobuf_FOUND})
message( FATAL_ERROR "Could not find Protobuf!" )
endif ()
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS Foo.proto)
Я получаю сообщение об ошибке Unknown CMake command "protobuf_generate_cpp". Если я проверю папку установки Protobuff, там есть файл CMake <istall path>/cmake/protobuf-module.cmake, который содержит определение функции.
CMake version: 3.10.2
Protobuf version: 3.6.1
В чем проблема?





Похоже, API cmake немного изменился. Попробуйте изменить его на
protobuf_generate(
LANGUAGE cpp
TARGET <YOUR_TARGET_NAME>
PROTOS Foo.proto)
Это напрямую добавит сгенерированные файлы в исходный список целевого объекта.
Посмотрите на функцию protobuf_generate в protobuf-config.cmake, чтобы узнать о новых возможностях.
Где для этого документация? В официальной документации CMake перечислены только protobuf_generate_cpp и protobuf_generate_python, даже для последней версии.
Я также хотел бы увидеть документацию по этому поводу. В настоящее время это единственное место в Интернете, где это упоминается.
@scatter см. мой ответ FindProtobuf cmake не предоставляет этот API. Это происходит из буферов протоколов, которые не так хорошо документированы.
Вам нужен protobuf_MODULE_COMPATIBLE.
Я использую CMake3.14. Последние 3 строки protobuf-config.cmake:
if (protobuf_MODULE_COMPATIBLE)
include("${CMAKE_CURRENT_LIST_DIR}/protobuf-module.cmake")
endif ()
и protobuf_generate_cpp() определен в protobuf-module.cmake.
Итак, чтобы protobuf_generate_cpp(), люди должны включить protobuf_MODULE_COMPATIBLE в своем CMakeLists.txt:
set(protobuf_MODULE_COMPATIBLE ON CACHE BOOL "")
Не забудьте очистить ранее созданные файлы кеша cmake, а затем снова вызвать cmake.
Существующий ответы помог мне, но пропустил много объяснений того, что происходит.
find_package может работать в режиме MODULE или CONFIG.
В режиме MODULE он ищет Find\<package\>.cmake (обычно принадлежит cmake).
В режиме CONFIG он ищет \<package\>Config.cmake (предоставляется в пакете).
Буферы cmake и протокола могут обеспечить реализацию protobuf_generate_cpp():
>grep -ri 'function(PROTOBUF_GENERATE_CPP' /opt/cmake-3.18.1/
/opt/cmake-3.18.1/share/cmake-3.18/Modules/FindProtobuf.cmake:function(PROTOBUF_GENERATE_CPP SRCS HDRS)
>grep -ri 'function(PROTOBUF_GENERATE_CPP' /opt/protobuf-3.5.0/
/opt/protobuf-3.5.0/lib64/cmake/protobuf/protobuf-module.cmake:function(PROTOBUF_GENERATE_CPP SRCS HDRS)
Использование подсказки PATHS переводит cmake в режим CONFIG, так что он будет использовать предоставленную protobuf реализацию, если сможет найти модуль Config.cmake.
В этом случае protobuf_generate_cpp () поступает из config.cmake, который требует:
set(protobuf_MODULE_COMPATIBLE ON CACHE BOOL "")
Поскольку, как упоминает @HaxtraZ, модуль конфигурации содержит:
if (protobuf_MODULE_COMPATIBLE)
include("${CMAKE_CURRENT_LIST_DIR}/protobuf-module.cmake")
endif ()
Это не требуется при использовании МОДУЛЯ FindProtobuf и, следовательно, не документировано там.
Хотя это не совсем его вина, cmake мог предупредить о возможном конфликте. Если подняли это здесь:
https://gitlab.kitware.com/cmake/cmake/-/issues/21228
Я также сообщил о путанице, вызванной отсутствием документации для проекта буферов протокола здесь:
https://github.com/protocolbuffers/protobuf/issues/7912
Примечание. По умолчанию в некоторых установках Linux (по крайней мере, CentOS7 и Debian9), как правило, буферы протокола создаются с использованием configure / make, а не cmake, который вообще не устанавливает файлы конфигурации cmake. Таким образом, find_package (protobuf 3.5.0 REQUIRED) будет работать, но find_package (protobuf 3.5.0 REQUIRED PATH I / only / Should / to / help) не сработает.
К сожалению, использование режима CONFIG и установка этой логической переменной не работает (по крайней мере, в Windows)
Это файл
ProtobufConfig.cmake, который читается во время вызоваfind_package(). CMake хранит каталог, содержащий этот файл, в переменной кешаProtobuf_DIR. Вы можете найти значение этой переменной в файлеCMakeCache.txt, расположенном в директории сборки. Убедитесь, что: 1. Найден правильный файлProtobufConfig.cmake(согласно переменнойProtobuf_DIR). 2. Данный файл содержит определение функцииprotobuf_generate_cpp.