Как заставить CMake найти google protobuf на windows? - PullRequest
14 голосов
/ 22 ноября 2010

Я использую Google Protobuf с CMake. В Linux библиотека Protobuf находится по адресу:

find_package( Protobuf REQUIRED ) 

CMake знает, где искать библиотеку. Как мне заставить это работать в Windows? Есть ли переменная окружения, которую я должен создать, например PROTOBUF_LIB? Я посмотрел в FindProtobuf.cmake, но не могу понять, что требуется.

Ответы [ 4 ]

7 голосов
/ 25 мая 2011

Я тоже с этим боролся.Чтобы быть более понятным.

В Windows (7, аналогично старым окнам): Пуск -> Панель управления -> Система -> Расширенные настройки системы -> Переменные среды

Затемлибо на верхней панели, либо на нижней панели (если вы хотите, чтобы она применялась к другим пользователям, сделайте это снизу), создайте две новые переменные.Первый -

  • CMAKE_INCLUDE_PATH, который указывает внизу вашего пути включения (должен содержать папку "google")
  • CMAKE_LIBRARY_PATH, который должен содержать "libprotobuf" "libprotobuf-lite""liteprotoc" .lib файлы.

После создания переменных нажмите OK, а затем перезапустите cmake (или очистите кэш).

4 голосов
/ 19 мая 2016

Новейшие protobuf v3 имеют встроенную поддержку CMake.

Вы можете использовать хранилище protobuf в качестве подмодуля и просто использовать

add_subdiretory("third-party/protobuf/cmake")

чтобы получить все цели protobuf. Затем вы можете добавить зависимость к protobuf с помощью

target_link_libraries(YourLibrary libprotobuf libprotobuf-lite libprotoc)

Доступен еще один возможный путь. С конфигурацией CMake protobuf вы можете собрать и установить двоичные файлы 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 голосов
/ 22 ноября 2010

Protobuf в Windows вызывает find_library, который будет искать переменные PATH и LIB.

0 голосов
/ 06 июня 2016

Я нашел способ использовать protobuf v2 с cmake в Windows и собрать его с настройками вашего проекта.Пожалуйста, попробуйте поискать в cmake-external-packages project и protobuf-v2 CMakeLists , которые выполняют эту работу.На самом деле, я написал это потому, что ExternalProject_Add неверно (потому что делает вещи в фазе сборки, а не в фазе генерации).

Этот CMakeLists.txt будет загружать protobuf из Gitub-релизов protobuf , извлечьи отправьте цели cmake, ссылки на которые вы должны добавить с помощью target_link_libraries.

Используйте git-subtree , git-submodule или просто скопируйте это содержимое репозитория в свойподпапка репозитория.

Затем добавьте пакеты, которые вы хотите использовать с add_subdiretory.Для protobuf используйте:

add_subdirectory(path/to/cmake-external-packages/protobuf-v2)

Включения Protobuf будут скопированы в папку path/to/cmake-external-packages/include.Вы можете настроить его местоположение в своих списках CMake верхнего уровня:

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)

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

...