Ubuntu 16.04 自带有 protobuf 2.6.1版本,如果想兼容的话按照下面方式安装
1.1.1 下载并解压缩
打开浏览器,输入地址:https://github.com/google/protobuf/releases/download/v3.4.1/protobuf-cpp-3.4.1.tar.gz
1.1.2 解压安装包
将下载后的包放在合适位置,右键Extract Here
解压
1.1.3 进入安装包目录,准备安装
进入解压后的文件夹
$ cd protobuf-3.4.1
1.2 安装
1)建议将protobuf安装在/usr/protobuf下。请先在/usr下新建一个名为protobuf的文件夹,此即为最终的安装路径。
$ sudo mkdir /usr/protobuf
2)执行以下命令:(执行下面第一句话时若不成功,则需要安装automake工具)
$ ./autogen.sh ##下载自github的代码需要执行此行来生成configure文件
$ ./configure --prefix=/usr/protobuf
$ make
$ make check
$ sudo make install
3)配置:(不是必须步骤,若上面步骤之后可以使用则不需添加下述内容)
$ sudo vim /etc/profile
在/etc/profile中添加下面内容
####### add protobuf lib path ########
#(动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/protobuf/lib/
#(静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/protobuf/lib/
#执行程序搜索路径
export PATH=$PATH:/usr/protobuf/bin/
#c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/protobuf/include/
#c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/protobuf/include/
#pkg-config 路径
export PKG_CONFIG_PATH=/usr/protobuf/lib/pkgconfig/
######################################
1.3 安装完成
保存退出/etc/profile。此时,最好重启电脑。
2.1.1 下载并解压缩
打开浏览器,输入地址:https://github.com/google/protobuf/releases/download/v3.4.1/protobuf-cpp-3.4.1.tar.gz
2.1.2 解压安装包
将下载后的包放在合适位置,右键Extract Here
解压
2.1.3 进入安装包目录,准备安装
进入解压后的文件夹
$ cd protobuf-3.4.1
2.2默认安装步骤(需root权限)
(不采用此种方法,因为会与ROS中的老版本的protobuf产生冲突)
$ ./autogen.sh ##下载自github的代码需要执行此行来生成configure文件
$ ./configure
$ make
$ make check
$ make install
此时,protobuf会被安装到usr/local/bin
,usr/local/lib
,usr/local/include
三个目录下。
测试protobuf是否安装成功:
在/usr/protobuf中查看是否生成了bin,lib,include这3个文件夹。
在终端输入
$ protoc --version
能查看到版本信息,输入which protoc能查看到安装路径。
4.1在我们所写的程序中的include文件夹下,创建.proto文件。
4.2将/usr/local/protobuf/bin/目录下的protoc程序复制到该include文件夹下。
4.3在该include文件夹下打开终端执行以下命令,生成C++版本的协议文件。
$ ./protoc -I=./ --cpp_out=./ test.proto
注:test.proto是要编译的文件名。
执行成功后,可以在当前目录下看到.h和.cc文件,之后就可以在我们的程序中使用生成的.h和.cc文件来序列化和反序列化消息了。
4.4使用protobuf写好ROS程序后,需要在CMakeLists.txt文件中添加下面两句
##use protobuf
INCLUDE_DIRECTORIES(/usr/protobuf/include/)
LINK_DIRECTORIES(/usr/protobuf/lib/)
注意:是在下面这句的前面添加以上两句!顺序不能错
# include_directories(include)
include_directories(
${catkin_INCLUDE_DIRS}
)
同时,在使用到了protobuf的ROS节点上添加protobuf,如下
add_executable(recv src/recv.cpp)
target_link_libraries(recv
${catkin_LIBRARIES}
zmq
protobuf
)