2013-11-12 1 views
4

У меня есть проблемы с CMakeCMake игнорировать точный вариант в findPackage для Protobuf

Я Writting в CMakeLists

набор (PROTOBUF_VERSION "2.4.1")
find_package (Protobuf $ {PROTOBUF_VERSION} НЕОБХОДИМЫЕ ТРЕБУЕМЫЕ)

Но когда я запускаю cmake на своей машине с protobuf 2.5.0, он успешно создает make-файл.
В стандартный вывод я только:

-- Found PROTOBUF: /usr/local/lib/libprotobuf.so

Но для ZLIB меня

-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.7")

Возможно, Protobuf не содержит версию себя в библиотеке. Есть ли способ указать версию protobufer?

ответ

4

Я не уверен, является ли ошибка в protobuf или в модуле CMake, но здесь у вас есть несколько вариантов.

Если вызов find_package преуспевает, у вас должен быть доступ как к пути protobuf include, так и к protoc-компилятору. Вы можете прочитать содержимое ${PROTOBUF_INCLUDE_DIRS}/google/protobuf/stubs/common.h и выполнить поиск по регулярному выражению для #define GOOGLE_PROTOBUF_VERSION, или вы можете вызывать protoc --version и искать результаты для правильной версии.

Таким образом, вариант 1, вы можете сделать:

find_package(Protobuf ${PROTOBUF_VERSION} REQUIRED) 
if(NOT EXISTS "${PROTOBUF_INCLUDE_DIRS}/google/protobuf/stubs/common.h") 
    message(FATAL_ERROR "Failed to find protobuf headers") 
endif() 

file(STRINGS "${PROTOBUF_INCLUDE_DIRS}/google/protobuf/stubs/common.h" Found 
    REGEX "#define GOOGLE_PROTOBUF_VERSION 2004001") 
if(NOT Found) 
    message(FATAL_ERROR "Didn't find v2.4.1 of protobuf") 
endif() 

или для варианта 2:

find_package(Protobuf ${PROTOBUF_VERSION} REQUIRED) 
if(NOT PROTOBUF_PROTOC_EXECUTABLE) 
    message(FATAL_ERROR "Failed to find protoc") 
endif() 

execute_process(COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --version 
       OUTPUT_VARIABLE VersionInfo) 
string(FIND "${VersionInfo}" "2.4.1" Found) 
if(Found LESS 0) 
    message(FATAL_ERROR "Didn't find v2.4.1 of protobuf") 
endif() 
+0

это работает) Я chosed 2-й вариант! – blackbass1988

Смежные вопросы