Как заставить 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)

Надеюсь, что это поможет.