2017-01-10 6 views
0

Я пытаюсь запустить пример, приведенный в protobuf repo here, версия C++. Я успешно установил библиотеку и могу запустить Makefile. Но запустив CMakeLists.txt, я получаю эту ошибку:Не могу использовать protobuf в cmakelists.txt

CMake Error at CMakeLists.txt:9 (find_package): 
    Could not find a package configuration file provided by "protobuf" with any 
    of the following names: 

    protobufConfig.cmake 
    protobuf-config.cmake 

    Add the installation prefix of "protobuf" to CMAKE_PREFIX_PATH or set 
    "protobuf_DIR" to a directory containing one of the above files. If 
    "protobuf" provides a separate development package or SDK, be sure it has 
    been installed. 


-- Configuring incomplete, errors occurred! 
See also "/home/cortana/Projects/CppProjects/proto/build/CMakeFiles/CMakeOutput.log". 
See also "/home/cortana/Projects/CppProjects/proto/build/CMakeFiles/CMakeError.log". 

Я обновил свой LD_LIBRARY_PATH, но эта ошибка все еще там. Как удалить эту ошибку?

EDIT:
CMakeLists.txt:

# Minimum CMake required 
cmake_minimum_required(VERSION 2.8.12) 

# Project 
project(protobuf-examples) 

include(FindProtobuf) 
# Find required protobuf package 
find_package(protobuf CONFIG REQUIRED) 

if(protobuf_VERBOSE) 
    message(STATUS "Using Protocol Buffers ${Protobuf_VERSION}") 
endif() 

set(CMAKE_INCLUDE_CURRENT_DIR TRUE) 

set(CMAKE_PREFIX_PATH 
    ${CMAKE_PREFIX_PATH} 
    ${THIRDPARTY_DIR}/protobuf-3.1.0 
) 

include_directories(${ProtobufIncludePath}) 

# http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F 
if(MSVC AND protobuf_MSVC_STATIC_RUNTIME) 
    foreach(flag_var 
     CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE 
     CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 
    if(${flag_var} MATCHES "/MD") 
     string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") 
    endif(${flag_var} MATCHES "/MD") 
    endforeach() 
endif() 

foreach(example add_person list_people) 
    set(${example}_SRCS ${example}.cc) 
    set(${example}_PROTOS addressbook.proto) 

    #Code Generation 
    if(protobuf_MODULE_COMPATIBLE) #Legacy Support 
    protobuf_generate_cpp(${example}_PROTO_SRCS ${example}_PROTO_HDRS ${${example}_PROTOS}) 
    list(APPEND ${example}_SRCS ${${example}_PROTO_SRCS} ${${example}_PROTO_HDRS}) 
    else() 

    foreach(proto_file ${${example}_PROTOS}) 
     get_filename_component(proto_file_abs ${proto_file} ABSOLUTE) 
     get_filename_component(basename ${proto_file} NAME_WE) 
     set(generated_files ${basename}.pb.cc ${basename}.pb.h) 
     list(APPEND ${example}_SRCS ${generated_files}) 

     add_custom_command(
     OUTPUT ${generated_files} 
     COMMAND protobuf::protoc 
     ARGS --cpp_out ${CMAKE_CURRENT_BINARY_DIR} -I ${CMAKE_CURRENT_SOURCE_DIR} ${proto_file_abs} 
     COMMENT "Generating ${generated_files} from ${proto_file}" 
     VERBATIM 
    ) 
    endforeach() 
    endif() 

    #Executable setup 
    set(executable_name ${example}_cpp) 
    add_executable(${executable_name} ${${example}_SRCS} ${${example}_PROTOS}) 
    if(protobuf_MODULE_COMPATIBLE) #Legacy mode 
    target_include_directories(${executable_name} PUBLIC ${PROTOBUF_INCLUDE_DIRS}) 
    target_link_libraries(${executable_name} ${PROTOBUF_LIBRARIES}) 
    else() 
    target_link_libraries(${executable_name} protobuf::libprotobuf) 
    endif() 

endforeach() 

EDIT 2:
После попытки в течение 2-х часов, я не мог исправить CMakeLists.txt предоставленный примеров Google. Я написал эту основную один, и это работает для меня:

PROJECT(protopuff) 
CMAKE_MINIMUM_REQUIRED (VERSION 3.5) 
SET(CMAKE_CXX_FLAGS "-g -Wall -Werror -std=c++11") 

INCLUDE(FindProtobuf) 
FIND_PACKAGE(Protobuf REQUIRED) 
INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIR}) 
PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_HEADER addressbook.proto) 
ADD_LIBRARY(proto ${PROTO_HEADER} ${PROTO_SRC}) 


INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) 
ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}_add add_person.cc) 
ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}_list list_people.cc) 
TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME}_add proto ${PROTOBUF_LIBRARY}) 
TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME}_list proto ${PROTOBUF_LIBRARY}) 
+0

Какую версию 'CMake' вы используете? – pSoLT

+0

'cmake_minimum_required (версия 2.8.12)'. У меня установлен «cmake 3.5.1». –

+0

@JohnM. у вас есть несколько версий CMake, установленных (обычно не рекомендуется)? Убедитесь, что вы выбрали правильный номер –

ответ

0

Ваша проблема здесь

find_package(protobuf CONFIG REQUIRED) 

имя должно начинаться с символа верхнего регистра: Protobuf. И именно поэтому ваша версия работает, потому что там вы использовали правильный случай.

FIND_PACKAGE(Protobuf REQUIRED) 

Here cmake documentation for find_package

The command searches for a file called <name>Config.cmake or <lower-case-name>-config.cmake for each name specified.

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

  • Нет связанных вопросов^_^