2017-12-13 24 views
2

Protocol Buffersをローカルにインストールしました。以下はROSパッケージのディレクトリ構造です:ROS内にローカルにインストールされたプロトコルバッファを使用できません

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

Protocol Buffers./configure --prefix=$PWDlib/protobuf-3.5.0内のディレクトリを使用して、ローカルにインストールされました。

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.txtmessage(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:私はUbuntu 14.04 LTS PCでROS Indigoを使用しています。私は 'catkin_make'を使用しています。これはROSインディゴと共に出荷されています。 –

+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}) 

私はちょうどローカルにインストールされたプロトコルバッファには、2つの変数を次のように設定する必要があります今のところ。しかし、それが良い習慣であるかどうかはわかりません。より良いソリューションをお持ちの方は、大歓迎です。

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>/は、そのプラットフォームの検索パスの1つとして、あなたが働いていたことがあったと思います。しかし、UNIXベースのOS'esであなたは(上記のリンク上のドキュメントあたり)検索パスとしてこれらを持っている:

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

あなたがここにも大文字小文字の区別について注意する必要があります。上記のパスで検索する最後のパス要素は<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 
関連する問題