1. protobuf怎麼編譯出protoc.exe
核心概念
1,.proto文件
相當於確定數據協議,數據結構中存在哪些數據,數據類型是怎麼樣
2,modifiers
2-1 required 不可以增加或刪除的欄位,必須初始化
2-2 optional 可選欄位,可刪除,可以不初始化
2-3 repeated 可重復欄位, 對應到java文件里,生成的是List
3,Message
在proto文件里,數據的協議時以Message的形式表現的。
4, Build
生成具體的java類時,例如Person.java,同時會存在build方法。文檔的意思是對於轉化後的數據,具有唯一性,build提供了便利的方法來初始化這些數據。
2. java 怎麼使用protobuf庫
1.到http://code.google.com/p/protobuf/downloads/list ,選擇其中的win版本下載,我選擇的是protoc-2.4.1-win32.zip
2.下載一個protobuf-java-2.4.1.jar文件(注意,要與你剛才下的proto.exe版本相同)
然後就開始開發了。
步驟:
1.用記事本編寫一個.proto文件:
}如:編寫的是test.proto
package protobuf;
option java_package = "com.sq.protobuf";
option java_outer_classname = "FirstProtobuf";
message testBuf {
required int32 ID = 1;
required string Url = 2;
}
將其放在與剛解壓的protoc.exe同級目錄中。
2.在cmd中,到protoc-2.4.1-win32文件夾下,
執行
E:\protoc-2.4.1-win32> protoc.exe --java_out=./ test.proto
則可以找到的一個生成的FirstProtobuf.java文件。
3.在MyEclipse中新建一個java project,建立包com.sq.protobuf,然後將剛才生成的FirstProtobuf.java文件放在其下面。
此時會報錯,因為沒有引入jar包,在package視圖下,將protobuf-java-2.4.1.jar引入,即可解決問題。
4.建立測試文件:
package com.sq.protobuf.test;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import com.google.protobuf.;
import com.sq.protobuf.FirstProtobuf;
public class Test {
public static void main(String[] args) {
//序列化過程
//FirstProtobuf是生成類的名字,即proto文件中的java_outer_classname
//testBuf是裡面某個序列的名字,即proto文件中的message testBuf
FirstProtobuf.testBuf.Builder builder=FirstProtobuf.testBuf.newBuilder();
builder.setID(777);
builder.setUrl("shiqi");
//testBuf
FirstProtobuf.testBuf info=builder.build();
byte[] result = info.toByteArray() ;
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@10.64.59.12:1521/orcl";
String user = "parkingsystem";
String password = "parkingsystem";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
if(!conn.isClosed()){
System.out.println("Succeeded connecting to the Database!");
//此處只能使用prepareStatement
PreparedStatement ps = conn.prepareStatement("insert into test(id,test) values (1,?)");
//寫入資料庫,要把它改寫為流的形式
ByteArrayInputStream stream = new ByteArrayInputStream(result);
ps.setBinaryStream(1,stream,stream.available());
Statement statement = conn.createStatement();
Blob blob = null;
ps.execute();
////////////////上述完成將寫入資料庫的操作,資料庫中對應的欄位的屬性要設置為Blob
String sql = "select test from test";
ResultSet rs = statement.executeQuery(sql);
if(rs.next()){
blob = rs.getBlob("test");
}
byte[] s = blob.getBytes(1,(int)blob.length());
FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(s);
System.out.println(testBuf);
conn.close();
}
}catch(Exception e) {
e.printStackTrace();
}
//反序列化過程
try {
FirstProtobuf.testBuf testBuf = FirstProtobuf.testBuf.parseFrom(result);
System.out.println(testBuf);
} catch ( e) {
e.printStackTrace();
}
}
}
發現可以將其序列化,插入到資料庫,並可以從資料庫出取出後,反序列化,內容可以正常顯示出來。
注意的就是2點:
1.不能用statement,否則無法插入blob類型的數據
2.為參數賦值時,要用
ByteArrayInputStream stream = new ByteArrayInputStream(result);
ps.setBinaryStream(1,stream,stream.available());
3. 如何實現protobuf在XCODE上armv7/armv7s/i386的交叉編譯
步驟一:部署protoc.exe
1)sudo su ---進入管理模式
//以下操作切換至protobuf文件夾下
2)./configure
3)make
4)make check
5)make install
此時可以查看protobuf文件夾下面的makefile文件,可以查看-build表示的本機環境以及-host表示的編譯庫的運行環境
我本地的-build=x86_64-apple-darwin12.3.0
-host=x86_64-apple-darwin12.3.0
(這兩個參數在後續配置腳本需要用到,與後面腳步的i686-apple-darwin12.3.0以及arm-apple-darwin12.3.0後綴「arm-apple-darwin12.3.0」保持一致)
6)make distclean清理已生成的makefile,為交叉編譯配置新makefile做准備
步驟二:配置交叉編譯
1)執行腳本ios-build.sh,腳本內容如下:
configure_for_platform() {
export PLATFORM=$1
#export PLATFORM=iPhoneOS
echo "Platform is ${PLATFORM}"
if [ "$PLATFORM" == "iPhoneSimulator" ]; then
export ARCHITECTURE=i386
export ARCH=i686-apple-darwin12.3.0
fi
if [ "$PLATFORM" == "iPhoneOS" ]; then
export ARCHITECTURE=$2
export ARCH=arm-apple-darwin12.3.0
fi
export ARCH_PREFIX=$ARCH-
export SDKVER="6.1"
#sdk版本號必須正確
export
DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/${PLATFORM}.platform/Developer
export SDKROOT="$DEVROOT/SDKs/${PLATFORM}$SDKVER.sdk"
export
PKG_CONFIG_PATH="$SDKROOT/usr/lib/pkgconfig:$DEVROOT/usr/lib/pkgconfig"
export AS="$DEVROOT/usr/bin/as"
export ASCPP="$DEVROOT/usr/bin/as"
export AR="$DEVROOT/usr/bin/ar"
export RANLIB="$DEVROOT/usr/bin/ranlib"
#export CPP="$DEVROOT/usr/bin/c++"
#export CXXCPP="$DEVROOT/usr/bin/c++"
export CC="$DEVROOT/usr/bin/gcc"
export CXX="$DEVROOT/usr/bin/g++"
export LD="$DEVROOT/usr/bin/ld"
export STRIP="$DEVROOT/usr/bin/strip"
export LIBRARY_PATH="$SDKROOT/usr/lib"
export CPPFLAGS=""
#export CFLAGS="-arch armv7 -fmessage-length=0 -pipe -fpascal-strings
-miphoneos-version-min=4.0 -isysroot=$SDKROOT -I$SDKROOT/usr/include
-I$SDKROOT/usr/include/c++/4.2.1/"
export CFLAGS="-arch ${ARCHITECTURE} -fmessage-length=0 -pipe
-fpascal-strings -miphoneos-version-min=4.0 -isysroot=$SDKROOT
-I$SDKROOT/usr/include -I$SDKROOT/usr/include/c++/4.2.1/"
export CXXFLAGS="$CFLAGS"
#export LDFLAGS="-isysroot='$SDKROOT' -L$SDKROOT/usr/lib/system
-L$SDKROOT/usr/lib/"
export LDFLAGS="-arch ${ARCHITECTURE} -isysroot='$SDKROOT'
-L$SDKROOT/usr/lib/system -L$SDKROOT/usr/lib/"
./configure --host=${ARCH} --with-protoc=protoc --enable-static
--disable-shared
}
mkdir ios-build
#build for iPhoneSimulator
configure_for_platform iPhoneSimulator
make clean
make
cp src/.libs/libprotobuf-lite.a ios-build/libprotobuf-lite-i386.a
#提取完整版本(i386)
cp src/.libs/libprotobuf.a ios-build/libprotobuf-i386.a
#build for iPhoneOS armv7
configure_for_platform iPhoneOS armv7
make clean
make
cp src/.libs/libprotobuf-lite.a ios-build/libprotobuf-lite-armv7.a
#提取完整版本(armv7)
cp src/.libs/libprotobuf.a ios-build/libprotobuf-armv7.a
#build for iPhoneOS armv7s
configure_for_platform iPhoneOS armv7s
make clean
make
cp src/.libs/libprotobuf-lite.a ios-build/libprotobuf-lite-armv7s.a
#提取完整版本(armv7s)
cp src/.libs/libprotobuf.a ios-build/libprotobuf-armv7s.a
make clean
#cerate a fat library containing all achitectures in libprotobuf-lite.a
xcrun -sdk iphoneos lipo -arch armv7 ios-build/libprotobuf-lite-armv7.a -arch
armv7s ios-build/libprotobuf-lite-armv7s.a -arch i386
ios-build/libprotobuf-lite-i386.a -create -output
ios-build/libprotobuf-lite.a
#合並三個完整版本(libprotobuf.a)
xcrun -sdk iphoneos lipo -arch armv7 ios-build/libprotobuf-armv7.a -arch
armv7s ios-build/libprotobuf-armv7s.a -arch i386 ios-build/libprotobuf-i386.a
-create -output ios-build/libprotobuf.a
2)將打包生成的libprotobuf-lite.a和libprotobuf.a復制至工程下進行編譯,可以編譯protobuf在xcode上的模擬器版本和真機版本,完成交叉編譯。
4. 如何編譯安裝protobuf極其python版本
下面以2.4.1為例。
首先自己設法下載一個源碼包:protobuf-2.4.1.tar.bz2,假設放到/data目錄下
1.安裝protobuf
tar jxvf protobuf-2.4.1.tar.bz2
cd /data/protobuf-2.4.1
./configure
make
make install
ldconfig
2. 安裝python版本
cd /data/protobuf-2.4.1/python
python setup.py build
python setup.py install
安裝完成。
注意:如果是在虛擬環境下安裝,則上面第一步需要以sudo許可權進行,第二步可以切換到虛擬環境下進行。
5. 如何生成arm64的protobuf庫
之前app用到的libmp3lame.a靜態庫,也要支持64位的模擬器(x86_64)和64位的真機(arm64)指令集。需要重新編譯
查閱了下資料,按照如下步驟,並做了些注釋和改動
1.http。//sourceforge。net/projects/lame/files/lame/3.99/ 下載lame的最新版本解壓到一個文件夾里例如 lame,全路徑如下/Users/8wm/Desktop/lame
2.下載build的腳本,我這里使用的是國外一個朋友的分享
https。//github。com/kewlbear/lame-ios-build
下載之後得到lame-build.sh拷貝到文件夾/Users/8wm/Desktop/lame
3.用bbedit或者其他編輯器打開這個腳本,按照注釋修改
4.打開Terminals,
輸入
cd /Users/8wm/Desktop/lame
chmod 777 lame-build.sh
sudo -s#
輸入系統密碼
./lame-build.sh
開始編譯,編譯完成之後。生成fat-lame目錄和thin-lame目錄,分別存放合並所有指令集的靜態庫,以及各指令集的靜態庫.
根據所需, lame.h和libmp3lame.a文件到project里,就可以正常使用了。
可以使用命令行,查看換個庫支持的指令集。
lipo -info libmp3lame.a
Architectures in the fat file: libmp3lame.a are: armv7 armv7s i386 x86_64 arm64
以下是build的腳本,請注意黃色的字和注釋。
#!/bin/sh
make distclean
CONFIGURE_FLAGS="--disable-shared --disable-frontend"
ARCHS="arm64 armv7s x86_64 i386 armv7"
# directories
# SOURCE是下載lame源碼包,解壓後的目錄,可以把sh腳本放到這個目錄,source改為""
SOURCE=""
# FAT是所有指令集build後,輸出的目錄,所有靜態庫被合並成一個靜態庫
FAT="fat-lame"
# SCRATCH是下載lame源碼包,解壓後的目錄,必須是絕對路徑
SCRATCH="/Users/8wm/Desktop/lame"
# must be an absolute path
# THIN 各自指令集build後輸出的靜態庫所在的目錄,每個指令集為一個靜態庫
THIN=`pwd`/"thin-lame"
COMPILE="y"
LIPO="y"
if [ "$*" ]
then
if [ "$*" = "lipo" ]
then
# skip compile
COMPILE=
else
ARCHS="$*"
if [ $# -eq 1 ]
then
# skip lipo
LIPO=
fi
fi
fi
if [ "$COMPILE" ]
then
CWD=`pwd`
echo "$CWD/$SOURCE........."
for ARCH in $ARCHS
do
echo "building $ARCH..."
mkdir -p "$SCRATCH/$ARCH"
cd "$SCRATCH/$ARCH"
if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]
then
PLATFORM="iPhoneSimulator"
if [ "$ARCH" = "x86_64" ]
then
SIMULATOR="-mios-simulator-version-min=7.0"
HOST=x86_64-apple-darwin
else
SIMULATOR="-mios-simulator-version-min=5.0"
HOST=i386-apple-darwin
fi
else
PLATFORM="iPhoneOS"
SIMULATOR=
HOST=arm-apple-darwin
fi
XCRUN_SDK=`echo $PLATFORM | tr '[:upper:]' '[:lower:]'`
CC="xcrun -sdk $XCRUN_SDK clang -arch $ARCH"
#AS="$CWD/$SOURCE/extras/gas-preprocessor.pl $CC"
CFLAGS="-arch $ARCH $SIMULATOR"
CXXFLAGS="$CFLAGS"
LDFLAGS="$CFLAGS"
CC=$CC $CWD/$SOURCE/configure \
$CONFIGURE_FLAGS \
--host=$HOST \
--prefix="$THIN/$ARCH" \
CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS"
make -j3 install
cd $CWD
done
fi
if [ "$LIPO" ]
then
echo "building fat binaries..."
mkdir -p $FAT/lib
set - $ARCHS
CWD=`pwd`
cd $THIN/$1/lib
for LIB in *.a
do
cd $CWD
lipo -create `find $THIN -name $LIB` -output $FAT/lib/$LIB
done
cd $CWD
cp -rf $THIN/$1/include $FAT
fi
6. 如何編譯protobuf 文件
ProtoBuf java 包編譯ProtoBuf的官方下載包並不包含jar文件,需要用戶自己configure/make….來自行編譯。由於Windows上沒有編譯環境,就用了一個笨一點方法處理了。
分別下載:
protobuf-2.4.1.zip ProtoBuf的源文件(包含了C++/Java/Python)的源文件
protoc-2.4.1-win32.zip 已經編譯過的用於Windows平台的protoc命令(該命令用於將.proto文件轉化為Java或C++源文件)。
分別解析這兩個文件,你可以在protoc-2.4.1-win32.zip解壓後的文件中找到一個protoc.exe文件,將其到protobuf-2.4.1/src目錄下,然後進入protobuf-2.4.1/java,執行:
mvn install
7. protobuf c++代碼怎麼編譯
步驟一:部署protoc.exe 1)sudo su ---進入管理模式 //以下操作切換至protobuf文件夾下 2)./configure 3)make 4)make check 5)make install 此時可以查看protobuf文件夾下面的makefile文件,可以查看-build表示的本機環境以及-host表示的編譯...
8. linux怎麼安裝protobuf-master
默認安裝步驟(需root許可權):
$wget https://github.com/google/protobuf/archive/v2.6.1.zip
$unzip protobuf-2.6.1.zip
$cd protobuf-2.6.1
下載自github的代碼需要首先執行 $ ./autogen.sh 生成configure文件
$ ./configure
$ make
$ make check
$ make install
我使用的是centos系統
usr/local/bin
usr/local/lib,
usr/local/include
是也系統默認路徑之一,所以到這一步就可以使用protobuf了
$ protoc -I=./ --cpp_out=./ test.proto
到你的test.proto文件所在目錄使用命令protoc -I=./ --cpp_out=./ 生成C++版本的協議文件
一切OK的話,你回在當前目錄看到.h和.cc文件修改安裝路徑(非root用戶需要修改安裝路徑):
protobuf默認安裝在 /usr/local 目錄
你可以修改安裝目錄通過 ./configure --prefix=命令
雖然我是root用戶但覺得默認安裝過於分散,所以統一安裝在/usr/local/protobuf下
$./configure --prefix=/usr/local/protobuf
$ make
$ make check
$ make install
到此步還沒有安裝完畢,在/etc/profile 或者用戶目錄 ~/.bash_profile
添加下面內容
####### add protobuf lib path ########
#(動態庫搜索路徑) 程序載入運行期間查找動態鏈接庫時指定除了系統默認路徑之外的其他路徑
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(靜態庫搜索路徑) 程序編譯期間查找動態鏈接庫時指定查找共享庫的路徑
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#執行程序搜索路徑
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序頭文件搜索路徑
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序頭文件搜索路徑
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
#pkg-config 路徑
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
######################################
好了,goog luck
9. erlang protobuffs怎麼編譯
客戶端lua,通信協議是protobuf,以前用網易的proto-gen-lua,使用過程遇到些問題需要繞,比如:1、每次更改、增加proto都要生成新的文件,代碼規模劇增2、由於lua本身,每個文件最大文件內全局local變數不能超過200個,所以當proto規模太大時,生成的lua文件就不能用,需要把proto拆分3、我之前做proto-gen-lua的集成,好像使用protobuf2.5的不行,被迫只能用2.4了,然後對proto里message的格式支持不全,比如message內包含其他的message是不行的,無奈只能把要包含的message定義再寫在message內部最近新項目,想研究下protobuf的動態解析,於是在github上發現了這個項目:/zhanjunxiong/luapb/issues/2動態解析的序列化反序列化效率肯定比生成代碼差很多,所以高並發server可能不適用,客戶端沒太大影響
10. cmake怎麼編譯protobuf
protobuf 是google的一個開源項目,其源代碼在github上可以下載到,並且源碼都採用cmake來構建,所以我們可以把源碼下載到本地,然後了利用cmake構建本地工程,然後編譯.