protoc編譯
㈠ grpc proto 文件 c++ java 可以共用嗎
ProtoBuf 是一套介面描述語言(IDL)和相關工具集(主要是 protoc,基於 C++ 實現),類似 Apache 的 Thrift)。
用戶寫好 .proto 描述文件,之後使用 protoc 可以很容易編譯成眾多計算機語言(C++、Java、Python、C#、Golang 等)的介面代碼。這些代碼可以支持 gRPC,也可以不支持。
㈡ Protocol Buffers(Objective-C)踩坑指南
這篇文章是講如何把protobuf文件的編譯工作集成到Xcode中,達到在Xcode中就像添加一般的OC文件一樣不進行任何多餘的操作直接編譯運行.proto文件的目的。
牛逼,這么智能嗎?是的,就是這么智能!
筆者的公司現在所有端都在統一使用一套protobuf數據結構,免除了多端重復定義同一套數據結構的重復工作,效率很高,非常值得推薦。並且Xcode 10進行了一些小優化來增加了對Protobuf的支持,相信不久以後,Xcode對Protobuf的支持將更加智能!
至於什麼是 Protobuf 和 Protobuf 語法教程,不是這篇文章的主題,請自行Google。
環境:Xcode 10+
語言:Objective-C
話不多說,正題開始:
首先,真正的企業級項目,並不只是網上很多教程裡面演示的一兩個 .proto 文件,而是一批 .proto 文件目錄的集合,並且是多端共享的。你會發現按照那些教程裡面的講的去做寫個demo或許可以,但是真正要達到企業級別的使用的時候,還遠遠不夠,你會遇到各種各樣的坑。別問我是怎麼知道的,我都是靠自己一個個踩出來的。
首先,要能編譯Protobuf文件,我們得安裝官方的編譯器。你可以選擇下面任意一種你喜歡的安裝方式:
安裝好後,在terminal中輸入 which protoc 檢測是否安裝成功,如安裝成功會返迴文件路徑: /usr/local/bin/protoc
如有問題,請自行google,不在本教程范圍內。
沒什麼好說的,新建一個Xcode工程。使用Cocoapods引入Protobuf的庫:
Pod search Protobuf
選擇最穩定的版本即可。
這里有兩種創建.proto文件的方式:
至於文件內容,如果你熟悉protobuf語法,那隨便寫幾行即可,如果不熟悉,那麼可以我的測試內容:
A.proto 文件內容:
B.proto 文件內容:
Xcode 自己並不認識 .proto文件,所以並不會自動編譯它們,我們需要把 .proto編譯器 自己集成到項目當中,集成的方式如下:
Project --> Build Rules --> 點擊+號 ,生成一個特定文件類型編譯腳本。
比如:
到此處,我們有幾個注意事項:
我們試試把 --proto_path 換成相對路徑,看會發生什麼,也就是把腳本換成
編譯運行,咦~報錯了。查看日誌,我們可以看到這么一條log信息:
翻譯過來就是在--proto_path這個參數中你必須指定.proto源文件的精確路徑, protoc 太笨了,它無法搞清楚這個相對路徑是不是我們要的絕對路徑。google的工程師說這太他么難了。所以這里很明確了, --proto_path 的參數值,只能是proto文件根目錄的絕對路徑。
我們上面說了,${INPUT_FILE_PATH} 是代表編譯輸入源文件的絕對路徑。
文檔裡面給的demo是:
protoc --proto_path=src --objc_out=build/gen src/foo.proto src/bar/baz.proto
什麼意思呢?
它說,最終編譯器會把 src/foo.proto 文件編譯成: build/gen/Foo.pbobjc.h 和 build/gen/Foo.pbobjc.m 文件。
而會把 src/bar/baz.proto 文件編譯成 build/gen/bar/Baz.pbobjc.h 和 build/gen/bar/Baz.pbobjc.m 。
而不是 build/gen/Baz.pbobjc.h 和 build/gen/Baz.pbobjc.m
也就是說protobuf編譯器最終生成的文件會自動按照文件源目錄結構存放。
特別強調 並不會 自動創建 build/gen 目錄,這個目錄需要你提前建好。
並且,查看最終編譯生成的.m文件,你會發現一些有趣的事情;比如我在A.proto中引入了B.proto文件,你會看到Protobuf最終編譯出來的A.pbobjc.m文件導入文件的格式是包含文件路徑的,例如:
我們注意到,上面設置的proto文件的編譯輸出路徑是 $DERIVED_FILE_DIR , 這是為何呢?
答案是為了方便Xcode的集成。
對於自定義的編譯腳本,都需要設置一個文件的輸出路徑.
我們點腳本框下面的Output Files下面的 + 號, 指定文件輸出路徑。
因為OC文件分為.h和.m文件,所以我們指定2個。
點了之後,你會發現,xcode默認給出的是 $(DERIVED_FILE_DIR)/newOutputFile ,
我們將其改為 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.h 和 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.m ,並且在.m文件的 Compiler Flags 中指定為 -fno-objc-arc 代表該.m文件採用mrc編譯。
編譯運行,大功告成,是不可能的!!!!
你會發現又報錯了:
什麼意思呢? 其實就是在 DerivedSources 下找不到 A.pbobjc.m 文件。因為我們指定這個編譯的輸出路徑在這個目錄下,所以Xcode在進行OC文件的編譯時會去這個目錄下找,但是它找不到。為什麼找不到呢?我們去這個目錄下看,這個目錄下確實沒有 A.pbobjc.m 這個文件,但是確發現有 a/A.pbobjc.m 。原因我們已經說了,protoc最終的編譯文件會自動加上目錄前綴。
有人可能會說,能不能把輸出文件改成 $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 呢?那我們就來試下。
編譯運行
what the hell?
原來,Xcode的Output Files特別蠢,它不支持類似這種通配符寫法: $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 。
也不支持傳入任何的自定義變數。
只能是明確的文件路徑和Xcode自帶的環境變數,但是實際項目中,可能不只一層路徑,有可能是文件夾下嵌套文件夾。
靠,那這怎麼辦呢?
實在沒辦法了,就在打算放棄的時候,咨詢了我們的腳本大神,我們嘗試了以下在腳本末尾再加了兩行:
是不是很機智?
什麼意思呢?就是說我們cd到該目錄,然後找到該文件對應生成的oc文件,將其一份兒到根目錄。懷著求神拜佛的意志,運行了以下,Perfect,終於不再報錯了,到目錄中查看,也正是我們想要的,所有文件都被出來了。
下一步,就是正常的在項目中import和使用了。
你以為到此就沒有坑了嗎?到此還有坑。有2點需要注意:
好了,就講到這里吧,如果覺得文章看得不是很明白,需要一個demo。或者大神有更好的建議,請在評論區留言~
如果文章對你有幫助,請不要吝嗇你的點贊哦,你的支持是我分享的動力~
如果大家喜歡,有時間再講講怎麼改改AFNetworking,能直接請求後端給的 Protobuf 格式的數據~
㈢ 請問哪裡有windows平台C++的bitcoin源代碼下載,我想用VC來編譯。
很多朋友都知道如何在linux平台如何編譯比特幣程序,但是,到了windows平台,
就會感覺到無從下手. 其實, 比特幣程序是跨平台的.
你要編譯windows版的比特幣程序,基本上有兩種方法,一種是在linux平台
(推薦ubuntu 13.10)通過交叉編譯的方法來編譯.另外一種,就是直接在windows平台編譯.
我想,你既然要在windows平台使用,我就詳細介紹一下如何在windwows平台編譯比特幣程序.
我的平台:windows7
第一步:安裝變編譯環境QT和MINGW,msys
1、msys是一個在windows平台模擬shell的程序。
下載安裝程序之後,通過安裝管理程序,按安裝以下內容:
From MinGW installation manager -> All packages -> MSYS
選中以下安裝包
msys-base-bin
msys-autoconf-bin
msys-automake-bin
msys-libtool-bin
點 apply changes開始安裝。他會自動下載安裝好。
需要注意的是,確保不要安裝msys-gcc和msys-w32api ,因為這兩個包和我們的編譯系統發生沖突。
很多人出現一些莫名其妙的問題,就是因為這兩個包。
2、安裝 MinGW-builds
下載並解壓縮 i686-4.8.2-release-posix-dwarf-rt_v3-rev3.7z 到C盤根目錄 C:\
注意我的目錄結構。你盡量和我一樣。
3、設置PATH環境變數,將C:\mingw32\bin;添加到第一個。
4、在命令行模式下輸入 gc -v 會得到以下內容
c:\gcc -v
Using built-in specs.
COLLECT_GCC=c:\mingw32\bin\gcc.exe
COLLECT_LTO_WRAPPER=c:/mingw32/bin/../libexec/gcc/i686-w64-mingw32/4.8.2/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: ../../../src/gcc-4.8.2/configure --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32 --prefix=/mingw32 --with-sysroot=/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32 --with-gxx-include-dir=/mingw32/i686-w64-mingw32/include/c++ --enable-shared --enable-static --disable-multilib --enable-languages=ada,c,c++,fortran,objc,obj-c++,lto --enable-libstdcxx-time=yes --enable-threads=posix --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --disable-sjlj-exceptions --with-dwarf2 --disable-isl-version-check --disable-cloog-version-check --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=i686 --with-tune=generic --with-libiconv --with-system-zlib --with-gmp=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-mpfr=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-mpc=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-isl=/c/mingw482/prerequisites/i686-w64-mingw32-static --with-cloog=/c/mingw482/prerequisites/i686-w64-mingw32-static --enable-cloog-backend=isl --with-pkgversion='i686-posix-dwarf-rev3, Built by MinGW-W64 project' --with-bugurl=http://sourceforge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -I/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include' CXXFLAGS='-O2 -pipe -I/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/include -I/c/mingw482/prerequisites/i686-zlib-static/include -I/c/mingw482/prerequisites/i686-w64-mingw32-static/include' CPPFLAGS= LDFLAGS='-pipe -L/c/mingw482/i686-482-posix-dwarf-rt_v3-rev3/mingw32/opt/lib -L/c/mingw482/prerequisites/i686-zlib-static/lib -L/c/mingw482/prerequisites/i686-w64-mingw32-static/lib -Wl,--large-address-aware'
Thread model: posix
gcc version 4.8.2 (i686-posix-dwarf-rev3, Built by MinGW-W64 project)
至此,你的開發環境已經搭建好了,很簡單吧
第二部分:下載bitcoin引用的外部庫
我們把它們全部放在 C:\deps目錄下
2.1 安裝OpenSSL
進入啟動 MinGw shell 比如目錄:(C:\MinGW\msys\1.0\msys.bat)運行這個msys.bat,就會啟動一個shell環境,提示符是$
輸入命令
cd /c/deps/
tar xvfz openssl-1.0.1g.tar.gz
cd openssl-1.0.1g
Configure no-shared no-dso mingw
make
等待幾分鍾後,就把openssl編譯好了。
2.2 下載Berkeley DB
我們推薦使用 4.8版本
同樣在msys shell環境下輸入以下命令
cd /c/deps/
tar xvfz db-4.8.30.NC.tar.gz
cd db-4.8.30.NC/build_unix
../dist/configure --enable-mingw --enable-cxx --disable-shared --disable-replication
make
等待編譯
2.3 安裝Boost
msys命令:
cd C:\deps\boost_1_55_0\
bootstrap.bat mingw
b2 --build-type=complete --with-chrono --with-filesystem --with-program_options --with-system --with-thread toolset=gcc variant=release link=static threading=multi runtime-link=static stage
2.4 安裝Miniupnpc
cd C:\deps\miniupnpc
mingw32-make -f Makefile.mingw init upnpc-static
msys shell命令
cd /c/deps/protobuf-2.5.0
configure --disable-shared
make
2.6 qrencode:
命令
cd /c/deps/libpng-1.6.10
configure --disable-shared
make
LIBS="../libpng-1.6.10/.libs/libpng16.a ../../mingw32/i686-w64-mingw32/lib/libz.a" \
png_CFLAGS="-I../libpng-1.6.10" \
png_LIBS="-L../libpng-1.6.10/.libs" \
configure --enable-static --disable-shared --without-tools
make
2.7 安裝 Qt 5 庫
下載和解壓縮
在 windows命令行輸入:
set INCLUDE=C:\deps\libpng-1.6.10;C:\deps\openssl-1.0.1g\include
set LIB=C:\deps\libpng-1.6.10\.libs;C:\deps\openssl-1.0.1g
cd C:\Qt\5.2.1
configure.bat -release -opensource -confirm-license -static -make libs -no-sql-sqlite -no-opengl -system-zlib -qt-pcre -no-icu -no-gif -system-libpng -no-libjpeg -no-freetype -no-angle -no-vcproj -openssl-linked -no-dbus -no-audio-backend -no-wmf-backend -no-qml-debug
mingw32-make
set PATH=%PATH%;C:\Qt\5.2.1\bin
cd C:\Qt\qttools-opensource-src-5.2.1
qmake qttools.pro
mingw32-make
3. 下載Bitcoin 0.9.1
在msys shell下輸入以下命令行:
cp /c/deps/libpng-1.6.10/.libs/libpng16.a /c/deps/libpng-1.6.10/.libs/libpng.a
cd /c/bitcoin-0.9.1
./autogen.sh
CPPFLAGS="-I/c/deps/boost_1_55_0 \
-I/c/deps/db-4.8.30.NC/build_unix \
-I/c/deps/openssl-1.0.1g/include \
-I/c/deps \
-I/c/deps/protobuf-2.5.0/src \
-I/c/deps/libpng-1.6.10 \
-I/c/deps/qrencode-3.4.3" \
LDFLAGS="-L/c/deps/boost_1_55_0/stage/lib \
-L/c/deps/db-4.8.30.NC/build_unix \
-L/c/deps/openssl-1.0.1g \
-L/c/deps/miniupnpc \
-L/c/deps/protobuf-2.5.0/src/.libs \
-L/c/deps/libpng-1.6.10/.libs \
-L/c/deps/qrencode-3.4.3/.libs" \
./configure \
--disable-upnp-default \
--disable-tests \
--with-qt-incdir=/c/Qt/5.2.1/include \
--with-qt-libdir=/c/Qt/5.2.1/lib \
--with-qt-bindir=/c/Qt/5.2.1/bin \
--with-qt-plugindir=/c/Qt/5.2.1/plugins \
--with-boost-system=mgw48-mt-s-1_55 \
--with-boost-filesystem=mgw48-mt-s-1_55 \
--with-boost-program-options=mgw48-mt-s-1_55 \
--with-boost-thread=mgw48-mt-s-1_55 \
--with-boost-chrono=mgw48-mt-s-1_55 \
--with-protoc-bindir=/c/deps/protobuf-2.5.0/src
make
strip src/bitcoin-cli.exe
strip src/bitcoind.exe
strip src/qt/bitcoin-qt.exe
這樣,你就得到了變異好的 bitcoin-cli.exe和bitcoind.exe ,bitcoin-qt.exe(windows QT圖形界面的錢包軟體)
㈣ linux 和windows 的protoc生成的proto文件不同嗎
當前版本為2.3.0,下載兩個壓縮包:protoc-2.3.0-win32.zip和protobuf-2.3.0.zip,前者是protobuf的編譯器,後者包含了有三程序語言的開發包。 2.解壓 首先解壓protoc-2.3.0-win32.zip,把protoc.exe文件放到path路徑中,最簡單的做法就是把這個...
㈤ 如何編譯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