Как заставить CMake найти google protobuf на окнах?
Я использую Google Protobuf с CMake. В Linux библиотека Protobuf находится по адресу:
find_package( Protobuf REQUIRED )
CMake знает, где искать библиотеку. Как я могу заставить это работать в Windows? Есть ли переменная среды, которую я должен создать, например PROTOBUF_LIB
? Я просмотрел FindProtobuf.cmake
, но не могу решить, что требуется.
Ответы
Ответ 1
Я также боролся с этим. Чтобы быть более понятным.
В Windows (7, аналогично более старым окнам):
Пуск → Панель управления → Система → Расширенные настройки системы → Переменные среды
Затем либо на верхней панели, либо на нижней панели (если вы хотите применить ее к другим пользователям, сделайте это внизу), создайте две новые переменные. Первый -
- CMAKE_INCLUDE_PATH, который указывает в нижней части вашего пути include (должен содержать папку "google" ).
- CMAKE_LIBRARY_PATH, который должен содержать файлы libprotobuf "libprotobuf-lite" liteprotoc.lib.
После создания переменных нажмите ОК, а затем заново запустите cmake (или очистите кеш).
Ответ 2
Protobuf на windows вызывает find_library, который будет искать ваши переменные PATH и LIB.
Ответ 3
Новый protobuf v3 (теперь в бета-версии) поддерживает CMake из коробки.
Вы можете использовать репозиторий protobuf в качестве подмодуля и просто использовать
add_subdiretory("third-party/protobuf/cmake")
чтобы получить все цели protobuf.
Затем вы можете добавить зависимость от protobuf с помощью
target_link_libraries(YourLibrary libprotobuf libprotobuf-lite libprotoc)
Доступен другой способ. С конфигурацией protobuf CMake вы можете создавать и устанавливать бинарные файлы protobuf один раз и использовать их в нескольких проектах в своей разработке:
git clone https://github.com/google/protobuf.git
mkdir protobuf\tmp
cd protobuf\tmp
cmake ..\cmake
cmake --build .
cmake --build . --target install
Затем вы можете использовать find_package
с подсказками, такими как
find_package(protobuf REQUIRED
HINTS
"C:/Program Files/protobuf"
"C:/Program Files (x86)/protobuf")
if (NOT PROTOBUF_FOUND)
message("protobuf not found")
return()
endif()
Надеюсь, что это поможет.
Ответ 4
Я нашел способ использовать protobuf v2 с cmake в Windows и создать его с вашими настройками проекта. Пожалуйста, попробуйте проект cmake-external-packages и protobuf-v2 CMakeLists которые выполняют эту работу.
На самом деле, я написал это, потому что ExternalProject_Add
не так (потому что делает вещи в фазе сборки вместо фазы генерации).
Этот файл CMakeLists.txt загрузит протобуф из protobuf github выпускает, извлекает и испускает мишени CMake, к которым вы должны добавить ссылку с помощью target_link_libraries
.
Используйте git-subtree, git-submodule или просто скопируйте содержимое этого репозитория в подпапку вашего репозитория.
Затем добавьте пакеты, которые вы хотите использовать с add_subdiretory
. Для протобуфа используйте:
add_subdirectory(path/to/cmake-external-packages/protobuf-v2)
Protobuf includes будет скопирован в папку path/to/cmake-external-packages/include
. Вы можете настроить его расположение в CMakeLists верхнего уровня:
set (EXTERNAL_PACKAGES_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/third-party/include
CACHE STRING "Directory for third-party include files, where include folders will be copied")
include_directories(${EXTERNAL_PACKAGES_INCLUDE_DIR})
Просто ссылка protobuf для вашего исполняемого файла:
add_executable(your_exe ${your_exe_sources})
target_link_libraries(your_exe libprotobuf libprotobuf-lite libprotoc)
Надеюсь, что это поможет.