2017-12-13 37 views
2

로컬에 Protocol Buffers을 설치했습니다.ROS 내에 로컬로 설치된 프로토콜 버퍼를 사용할 수 없습니다.

. 
├── CMakeLists.txt 
├── package.xml 
├── include 
│   ├── addressbook.pb.cc 
│   ├── addressbook.pb.h 
│   └── addressbook.proto 
├── lib 
│   └── protobuf-3.5.0 
└── src 
    └── main.cpp 

Protocol Bufferslib/protobuf-3.5.0 디렉토리 내에 ./configure --prefix=$PWD를 사용하여 로컬로 설치 : 아래 ROS 패키지의 디렉토리 구조입니다.

catkin_make을 사용하여 ROS 패키지를 컴파일하는 동안 이전 버전의 프로토콜 버퍼를 참조하고 버전 비 호환성 오류를 나타내는 것으로 보입니다.

[ 0%] Building CXX object local_protobuf_ros_example/CMakeFiles/addressbook_protobuf.dir/include/addressbook.pb.cc.o 
In file included from /home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.cc:4:0: 
/home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is 
#error This file was generated by a newer version of protoc which is 
^
/home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.h:13:2: error: #error incompatible with your Protocol Buffer headers. Please update 
#error incompatible with your Protocol Buffer headers. Please update 
^
/home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.h:14:2: error: #error your headers. 
#error your headers. 
^
In file included from /home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.cc:4:0: 
/home/bgplvm/ros_ws/src/local_protobuf_ros_example/include/addressbook.pb.h:23:35: fatal error: google/protobuf/arena.h: No such file or directory 
#include <google/protobuf/arena.h> 
           ^
compilation terminated. 

있지만, 나는 CMakeLists.txt 내부 message(STATUS "Using Protocol Buffers ${Protobuf_VERSION}") 문을 넣고는 프로토콜 버퍼 3.5.0를 사용하고 있음을 발견했다. CMakeLists.txt 아래를 참조하십시오 :

cmake_minimum_required(VERSION 2.8.3) 
project(local_protobuf_ros_example) 

find_package(catkin REQUIRED COMPONENTS roscpp) 

set(PROTOBUF_FOLDER ${PROJECT_SOURCE_DIR}/lib/protobuf-3.5.0) 

set(CMAKE_PREFIX_PATH 
    ${CMAKE_PREFIX_PATH} 
    "${PROTOBUF_FOLDER}/cmake/build/release/lib/x86_64-linux-gnu/cmake/protobuf" 
) 

find_package(Protobuf CONFIG REQUIRED) 
message(STATUS "Using Protocol Buffers ${Protobuf_VERSION}") 

catkin_package() 
include_directories(include ${catkin_INCLUDE_DIRS} ${PROTOBUF_INCLUDE_DIRS}) 

add_library(addressbook_protobuf include/addressbook.pb.cc) 

add_executable(main src/main.cpp) 
target_link_libraries(main ${catkin_LIBRARIES} addressbook_protobuf ${PROTOBUF_LIBRARIES}) 

무엇이 누락 되었습니까? 로컬 설치를 언급하기 때문에 오류가 표시되지 않고 작동합니다. 그렇지 않니?

+0

어떤 CMake 버전을 사용합니까? 스크립트'FindProtobuf.cmake'는 CMake와 함께 배송됩니다. 'Protobuf_VERSION' 변수를 설정하는 [스크립트] (https://cmake.org/cmake/help/v3.6/module/FindProtobuf.html)는 여러분이 사용하는 변수 대신'Protobuf_INCLUDE_DIRS'와'Protobuf_LIBRARIES' 변수를 설정합니다 : PROTOBUF_INCLUDE_DIRS' 및'PROTOBUF_LIBRARIES'를 포함합니다. – Tsyvarev

+0

@Tsyvarev : 우분투 14.04 LTS PC에서 ROS Indigo를 사용하고 있습니다. 나는 ROS Indigo와 함께 배송되는'catkin_make'를 사용하고 있습니다. –

+0

CMake 버전은 'CMakeLists.txt'에있는 [CMAKE_VERSION] (https://cmake.org/cmake/help/v3.7/variable/CMAKE_VERSION.html) 변수의 출력 값으로 확인할 수 있습니다. – Tsyvarev

답변

0

로컬로 설치된 프로토콜 버퍼를 사용하는 해결 방법을 발견했습니다.

  1. Protobuf_INCLUDE_DIRS
  2. Protobuf_LIBRARIES

CMakeLists.txt 아래를 참조하십시오 : 그것은 작동

cmake_minimum_required(VERSION 2.8.3) 
project(local_protobuf_ros_example) 

find_package(catkin REQUIRED COMPONENTS roscpp) 

set(PROTOBUF_FOLDER ${PROJECT_SOURCE_DIR}/lib/protobuf-3.5.0) 

set(Protobuf_INCLUDE_DIRS ${PROTOBUF_FOLDER}/include) 
set(Protobuf_LIBRARIES ${PROTOBUF_FOLDER}/lib/libprotobuf.so) 

catkin_package() 
include_directories(include ${catkin_INCLUDE_DIRS} ${Protobuf_INCLUDE_DIRS}) 

add_library(addressbook_protobuf include/addressbook.pb.cc) 

add_executable(main src/main.cpp) 
target_link_libraries(main ${catkin_LIBRARIES} addressbook_protobuf ${Protobuf_LIBRARIES}) 

난 그냥 로컬에 설치된 프로토콜 버퍼에 두 변수 다음 설정해야합니다 지금과 같은. 그러나 좋은 연습인지 아닌지 확실하지 않습니다. 더 나은 해결책을 가진 사람은 누구나 환영합니다.

0

CMAKE_PREFIX_PATH 집합이 잘못되었습니다. 이것은 패키지의 cmake 설정 파일의 위치가 아니라 protobuf가 설치된 접두어를 가리켜 야합니다.

그래서 변경해보십시오 : ./configure --prefix=<INSTALL_PREFIX>

의 --prefix 인수에 주어진 동일한 위치에 ${PROTOBUF_FOLDER} 점을 가정한다

set(CMAKE_PREFIX_PATH 
    ${CMAKE_PREFIX_PATH} 
    ${PROTOBUF_FOLDER} 
) 

은을 참조하십시오 여기에

set(CMAKE_PREFIX_PATH 
    ${CMAKE_PREFIX_PATH} 
    ${PROTOBUF_FOLDER}/cmake/build/release/lib/x86_64-linux-gnu/cmake/protobuf 
) 

find_packagehere.에 대한 검색 경로 설명서 (페이지의 대략 절반 아래)

<prefix>/이 해당 플랫폼의 검색 경로 중 하나라고 생각했던 것처럼 Windows를 사용하고 있었다면 믿을 수있었습니다. 또한 여기 대소 문자 구분에주의해야

<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/ 
<prefix>/(lib/<arch>|lib|share)/<name>*/ 
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ 

:하지만 유닉스 기반 OS'es에 당신은 검색 경로로 (위의 링크에 대한 문서 당)이있다. 위의 경로에서 검색하는 마지막 경로 요소는 <name>*입니다.내가 귀하의 질문에 protobuf가 'protobuf'라는 이름으로 설치되는 것처럼 보이지만 귀하의 find_package 전화는 'Protobuf'를 요청하고 있습니다. 그래서, 또한 시도에 전화를 변경 :

find_package(protobuf CONFIG REQUIRED) 

그리고 ./configure ...를 통해 빌드를 수행 할 때 마지막으로, 지금까지 내가 말할 수있는, protobuf는 CMake의 CONFIGS를 설치하지 않습니다. CMake 구성을 설치하려면 다음을 수행하여 CMake를 통해 빌드해야했습니다.

cd protobuf-3.5/cmake 
cmake -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> . 
make 
make install