Ubuntu 下配置protobuf
http://blog.csdn.net/guoyilongedu/article/details/17093811[html] viewplaincopy最近想研究protobuf ,尝试了很多次都没有成功,我用的是ubuntu,在虚拟机下面的 ,protobuf 也用了很多版本但都没有成功。最终用的是2.5.0版本才成功,话不多说直接开始梳
http://blog.csdn.net/guoyilongedu/article/details/17093811
- 最近想研究protobuf ,尝试了很多次都没有成功,我用的是ubuntu,在虚拟机下面的 ,protobuf 也用了很多版本但都没有成功。最终用的是2.5.0版本才成功,话不多说直接开始梳理一下配置的流程。
- 首先得到 protobuf 相应的包文件 ,在终端上输入如下
- wget http://protobuf.googlecode.com/files/protobuf-2.5.0.tar.gz
下载完毕后进行解压
- tar zxvf protobuf-2.5.0.tar.gz
进入到解压目录
- cd protobuf-2.5.0
- ./configure
中间可能会出错,估计是G++没装好,因为安装的时候要进行编译
安装G++
- apt-get install g++
- apt-get install vim
- apt-get install make
./configure 成功之后,接下来 就如下几步
- make
- make check
- make install
安装完成后在终端下执行
- vim ~/.profile
打开配置文件,在该文件中添加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
然后保存退出,接下来执行
- source ~/.profile
是配置文件修改生效,最后执行
- protoc --version
查看protobuf版本以测试是否安装成功
接下来的操作 可以参照如下 链接 ,他们写得非常好
运行,ubuntu下默认报错
protoc: error while loading shared libraries: libprotobuf.so.7: cannot open shared object file: No such file or directory
所以安装共享库后要注意共享库路径设置问题, 如下:
1) 如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令
ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.
2) 如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:
# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
# echo "/usr/local/lib" >> /etc/ld.so.conf
# ldconfig
3) 如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下, 但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库.
LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下, 其中有一大堆库文件在/usr/local/mysql/lib下面, 则可以在.bashrc或.bash_profile或shell里加入以下语句即可:
export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH
一般来讲这只是一种临时的解决方案, 在没有权限或临时需要的时候使用.
http://www.ccvita.com/507.html
创建一个proto 文件 比如 msg.proto
- package lm;
- message helloworld
- {
- required int32 id = 1; // ID
- required string str = 2; // str
- optional int32 opt = 3; //optional field
- }
将消息文件msg.proto映射成cpp文件
protoc -I=. --cpp_out=. msg.proto
对其代码做了一些纠正
write cpp
- #include "msg.pb.h"
- #include <iostream>
- #include <fstream>
- using namespace std;
- using namespace lm;
- int main(void)
- {
- lm:helloworld msg1;
- msg1.set_id(101);
- msg1.set_str("hello");
- fstream output("./msg.pb",ios::out | ios::trunc | ios::binary);
- if( !msg1.SerializeToOstream(&output))
- {
- cerr << "Failed to write msg." << endl;
- return -1;
- }
- return 0;
- }
reader.cpp
- #include "msg.pb.h"
- #include <iostream>
- #include <fstream>
- using namespace std;
- using namespace lm;
- void listmsg(const lm::helloworld & msg)
- {
- cout << msg.id() <<endl;
- cout << msg.str() <<endl;
- }
- int main(void)
- {
- lm:helloworld msg1;
- fstream input("./msg.pb", ios::in | ios::binary);
- if (!msg1.ParseFromIstream(&input)) {
- cerr << "Failed to parse address book." << endl;
- return -1;
- }
- listmsg(msg1);
- return 0;
- }
Makefile
- all: write reader
- clean:
- rm -f write reader msg.*.cc msg.*.h *.o log
- proto_msg:
- protoc --cpp_out=. msg.proto
- write: msg.pb.cc write.cpp
- g++ msg.pb.cc write.cpp -o write `pkg-config --cflags --libs protobuf`
- reader: msg.pb.cc reader.cpp
- g++ msg.pb.cc reader.cpp -o reader `pkg-config --cflags --libs protobuf`
- 如果提示 make: Nothing to be done for 'all
- 则执行make clean
- 如果从头开始执行的话
- 1.make clean
- 2.make proto_msg
- 3.make
- package demo;
- message People
- { required string name = 1;
- required int32 id = 2;
- required string email = 3; }
- demo::People p;
- p.set_name("guoyilong");
- p.set_id(i);
- p.set_email("guoyilong@163.com");
- p.SerializeToString(&data);
当 i = 0 里 也就是 set_id(0)时 有一个很奇怪的现象,具体如下
data.length() 为32
strlen(data.c_str()); 则为 12 两个结果不一致
而i 不等于0 则不会出现这种情况 现在还是不解 记录一下
更多推荐
所有评论(0)