亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Protobuf在Cmake中的正確使用方法詳解

Protobuf在Cmake中的正確使用方法詳解

熱門標(biāo)簽:廊坊地圖標(biāo)注申請入口 地圖標(biāo)注資源分享注冊 海南人工外呼系統(tǒng)哪家好 慶陽外呼系統(tǒng)定制開發(fā) 高德地圖標(biāo)注公司位置需要錢嗎 襄陽外呼增值業(yè)務(wù)線路解決方案 怎么去掉地圖標(biāo)注文字 北京外呼系統(tǒng)咨詢電話 合肥阿里辦理400電話號

Protobuf是google開發(fā)的一個(gè)序列化和反序列化的協(xié)議庫,我們可以自己設(shè)計(jì)傳遞數(shù)據(jù)的格式,通過.proto文件定義我們的要傳遞的數(shù)據(jù)格式。例如,在深度學(xué)習(xí)中常用的ONNX交換模型就是使用.proto編寫的。我們可以通過多種前端(MNN、NCNN、TVM的前端)去讀取這個(gè).onnx這個(gè)模型,但是首先你要安裝protobuf。

在之前的博文中已經(jīng)簡單介紹了onnx,其中onnx.proto就代表了onnx模型的基本數(shù)據(jù)結(jié)構(gòu)。一般來說,protobuf經(jīng)常搭配Cmake使用,Cmake有官方的modules,可以通過簡單的幾個(gè)命令protobuf_generate_cpp來生成對應(yīng)的.pb.cc.pb.h

簡單的例子:

find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT foo.proto)
protobuf_generate_python(PROTO_PY foo.proto)
add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(bar ${Protobuf_LIBRARIES})

但是這個(gè)例子太簡單了,如果我們的.proto文件只有一個(gè)或者說都只在一個(gè)目錄里,那用這個(gè)命令沒什么毛病...

但如果是這種情況,我們的文件目錄如下:

├── CMakeLists.txt
├── README.md
├── meta
│  └── proto
│    ├── CMakeLists.txt
│    └── common
│      ├── bar
│      │  ├── CMakeLists.txt
│      │  └── bar.proto
│      └── foo
│        ├── CMakeLists.txt
│        └── foo.proto
└── src
  ├── CMakeLists.txt
  ├── c_proto.cc
  └── c_proto.hh

其中foo.proto文件如下:

message foo_msg 
{
 optional string name = 1;
}

bar.proto的文件如下:

import "common/foo/foo.proto";
 
message bar_msg 
{
 optional foo_msg foo = 1;
 optional string name = 2;
}

如上,bar文件引用foo,而且這兩個(gè)不在一個(gè)目錄,如果直接使用protobuf_generate_cpp來生成,直接會報(bào)錯(cuò)。(這個(gè)例子取自Yu的一篇博文)

也想過把他倆放到同一個(gè)目錄...然后bar.proto中import的代碼就要修改,雖然這樣可以,但顯然是不適合大型的項(xiàng)目。

而這個(gè)大型項(xiàng)目顯然就是mediapipe...折磨了我好久。

關(guān)于mediapipe的詳細(xì)介紹在另一篇文章。mediapipe中使用了大量的ProtoBuf技術(shù)來表示圖結(jié)構(gòu),而且mediapipe原生并不是采用cmake來構(gòu)建項(xiàng)目,而是使用google自家研發(fā)的bazel,這個(gè)項(xiàng)目構(gòu)建系統(tǒng)我就不評價(jià)了,而現(xiàn)在我需要使用Cmake來對其進(jìn)行構(gòu)建。

這也是噩夢的開始,mediapipe的.proto文件很多,核心的framework的目錄下存在很多的.proto文件,根目錄和子目錄都有.proto文件:

而且每個(gè)proto文件之間存在引用的順序,framework根目錄下的calculator.proto文件:

// mediapipe/framework/calculator.proto
syntax = "proto3";

package mediapipe;

import public "mediapipe/framework/calculator_options.proto";

import "google/protobuf/any.proto";
import "mediapipe/framework/mediapipe_options.proto";
import "mediapipe/framework/packet_factory.proto";
import "mediapipe/framework/packet_generator.proto";
import "mediapipe/framework/status_handler.proto";
import "mediapipe/framework/stream_handler.proto";

每個(gè).proto文件都import了其他目錄下的文件,這里的import類似于C++中的include,但是這里的import又可以相互引用,例如上述的status_handler.proto也引用了mediapipe_options.proto

如果直接對上述所有的.proto文件直接使用protobuf_generate_cpp命令,會直接報(bào)錯(cuò),因?yàn)檫@些文件不在一個(gè)目錄,而且import的相對目錄也無法分析。另外,不同目錄內(nèi)的.cc文件會引用相應(yīng)目錄生成的.pb.h文件,我們需要生成的.pb.cc.pb.h在原始的目錄中,這樣才可以正常引用,要不然需要修改其他源代碼的include地址,比較麻煩。

CLion中Cmake來編譯proto生成的.pb.cc.pb.h不在原始目錄,而是集中在cmake-build-debug(release)中,我們額外需要將其中生成的.pb.cc.pb.h文件移動到原始地址(Clion的情況是這樣)。

正確修改cmake

對于這種情況,比較合適的做法是直接使用命令進(jìn)行生成。

首先找到所有需要編譯的.proto文件:

file(GLOB protobuf_files
    mediapipe/framework/*.proto
    mediapipe/framework/tool/*.proto
    mediapipe/framework/deps/*.proto
    mediapipe/framework/testdata/*.proto
    mediapipe/framework/formats/*.proto
    mediapipe/framework/formats/annotation/*.proto
    mediapipe/framework/formats/motion/*.proto
    mediapipe/framework/formats/object_detection/*.proto
    mediapipe/framework/stream_handler/*.proto
    mediapipe/util/*.proto
    mediapipe/calculators/internal/*.proto
    )

接下來,定義相關(guān)的目錄地址,PROTO_META_BASE_DIR為編譯之后生成文件的目錄。PROTO_FLAGS很重要,指定編譯.proto文件時(shí)的總的尋找路徑,.proto中的import命令根據(jù)根據(jù)這個(gè)地址去連接其他的.proto文件:

SET(PROTO_META_BASE_DIR ${CMAKE_CURRENT_BINARY_DIR})
LIST(APPEND PROTO_FLAGS -I${CMAKE_CURRENT_SOURCE_DIR})

設(shè)置好之后,通過FOREACH去循環(huán)之前的.proto文件,依次編譯每個(gè)文件,然后將生成的.pb.cc.pb.h移動回原始的目錄,至此就可以正常工作了。

FOREACH(FIL ${protobuf_files})

  GET_FILENAME_COMPONENT(FIL_WE ${FIL} NAME_WE)

  string(REGEX REPLACE ".+/(.+)\\..*" "\\1" FILE_NAME ${FIL})
  string(REGEX REPLACE "(.+)\\${FILE_NAME}.*" "\\1" FILE_PATH ${FIL})

  string(REGEX MATCH "(/mediapipe/framework.*|/mediapipe/util.*|/mediapipe/calculators/internal/)" OUT_PATH ${FILE_PATH})

  set(PROTO_SRCS "${CMAKE_CURRENT_BINARY_DIR}${OUT_PATH}${FIL_WE}.pb.cc")
  set(PROTO_HDRS "${CMAKE_CURRENT_BINARY_DIR}${OUT_PATH}${FIL_WE}.pb.h")

  EXECUTE_PROCESS(
      COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} ${PROTO_FLAGS} --cpp_out=${PROTO_META_BASE_DIR} ${FIL}
  )
  message("Copying " ${PROTO_SRCS} " to " ${FILE_PATH})

  file(COPY ${PROTO_SRCS} DESTINATION ${FILE_PATH})
  file(COPY ${PROTO_HDRS} DESTINATION ${FILE_PATH})

ENDFOREACH()

參考鏈接

http://blog.argcv.com/articles/3884.c
https://www.v2ex.com/t/602363
https://stackoverflow.com/questions/29720410/no-member-found-when-use-cmake-construct-proto/29817843

到此這篇關(guān)于Protobuf在Cmake中的正確使用方法的文章就介紹到這了,更多相關(guān)Protobuf使用Cmake內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • java程序中protobuf的基本用法示例
  • 淺談序列化之protobuf與avro對比(Java)
  • 基于Protobuf動態(tài)解析在Java中的應(yīng)用 包含例子程序
  • protobuf c++編程筆記
  • python使用protobufde的過程解析
  • SpringBoot使用protobuf格式的接口方式
  • Netty結(jié)合Protobuf進(jìn)行編解碼的方法
  • Python使用protobuf序列化和反序列化的實(shí)現(xiàn)
  • C#語言使用gRPC、protobuf(Google Protocol Buffers)實(shí)現(xiàn)文件傳輸功能
  • 在java程序中使用protobuf

標(biāo)簽:綿陽 平頂山 商丘 臺州 哈密 鶴崗 株洲 鎮(zhèn)江

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Protobuf在Cmake中的正確使用方法詳解》,本文關(guān)鍵詞  Protobuf,在,Cmake,中的,正確,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Protobuf在Cmake中的正確使用方法詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于Protobuf在Cmake中的正確使用方法詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美大片a一级毛片视频| 国产一级生活片| 天天做日日干| 91麻豆精品国产高清在线| 日韩一级黄色| 精品国产香蕉伊思人在线又爽又黄| 午夜欧美成人久久久久久| 欧美国产日韩在线| 国产国语在线播放视频| 一级毛片视频免费| 国产成a人片在线观看视频| 中文字幕Aⅴ资源网| 国产激情视频在线观看| a级毛片免费观看网站| 91麻豆精品国产自产在线观看一区| 国产成+人+综合+亚洲不卡| 黄色福利| 天天色成人| 精品国产一区二区三区免费| 欧美日本韩国| 日日夜人人澡人人澡人人看免| 天堂网中文字幕| 九九免费高清在线观看视频| 国产一区二区精品久| 二级片在线观看| 日韩一级黄色片| 欧美a级片视频| 天天色色色| 国产高清视频免费| 日韩专区亚洲综合久久| 精品国产一区二区三区久久久狼| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产精品自拍在线观看| 四虎影视久久| 亚洲第一视频在线播放| 国产综合91天堂亚洲国产| 免费毛片基地| 九九精品久久| 亚洲女人国产香蕉久久精品| 夜夜操天天爽| 精品国产一区二区三区久 | 91麻豆精品国产高清在线| 国产一区二区精品尤物| 国产一级强片在线观看| 国产成人精品在线| 国产高清在线精品一区二区| 欧美国产日韩久久久| 精品国产一区二区三区久久久狼| 国产成人精品综合久久久| 国产一区国产二区国产三区| 亚洲精品久久玖玖玖玖| 夜夜操天天爽| 91麻豆爱豆果冻天美星空| 日韩欧美一二三区| 成人a级高清视频在线观看| 日日日夜夜操| 日本在线不卡免费视频一区| 精品国产香蕉在线播出| 黄色福利片| 国产精品免费精品自在线观看| 国产一区二区精品久久91| 国产不卡在线播放| 在线观看导航| 黄视频网站免费| 色综合久久天天综合绕观看| 国产91丝袜在线播放0| 欧美日本免费| 久久国产一久久高清| 欧美激情一区二区三区视频高清| 亚洲 激情| 成人a大片在线观看| 午夜激情视频在线播放| 国产一区二区精品在线观看| 国产伦理精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美激情一区二区三区在线| 黄视频网站在线免费观看| 韩国三级视频网站| 国产美女在线一区二区三区| 91麻豆精品国产高清在线| 亚洲 国产精品 日韩| 日韩男人天堂| 国产a毛片| 精品国产三级a| 国产国语对白一级毛片| 麻豆系列 在线视频| 超级乱淫伦动漫| 亚洲第一色在线| 天天色色色| 美女免费黄网站| 久久久久久久久综合影视网| 台湾毛片| 天天做人人爱夜夜爽2020毛片| 亚久久伊人精品青青草原2020| 四虎久久影院| 国产一区二区精品在线观看| 国产韩国精品一区二区三区| 国产网站免费| 天天色色色| 欧美一级视频免费| 亚洲爆爽| 免费毛片基地| 国产成人欧美一区二区三区的| 高清一级片| 久久国产一久久高清| 国产一级强片在线观看| 精品视频在线看| 四虎论坛| 成人免费观看的视频黄页| 九九久久国产精品大片| 久久99这里只有精品国产| 91麻豆国产福利精品| 日韩专区亚洲综合久久| 国产视频网站在线观看| 国产91精品系列在线观看| 二级特黄绝大片免费视频大片| 九九精品在线| 天天做人人爱夜夜爽2020| 亚洲女人国产香蕉久久精品| 精品久久久久久中文字幕2017| 国产网站免费在线观看| 色综合久久天天综合绕观看| 免费国产在线观看| 四虎论坛| 青青青草影院 | 二级片在线观看| 国产91视频网| 国产亚洲免费观看| 亚欧成人乱码一区二区| 欧美激情一区二区三区中文字幕| 999精品视频在线| 国产伦久视频免费观看视频| 欧美爱色| 欧美大片毛片aaa免费看| 久久99中文字幕| 亚洲 欧美 91| 日韩专区一区| 国产精品免费久久| 欧美国产日韩一区二区三区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产高清在线精品一区a| 国产精品免费精品自在线观看| 成人免费观看的视频黄页| 黄色福利片| 精品国产一区二区三区久久久蜜臀| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 免费一级片在线观看| 99久久精品国产国产毛片| 一级毛片视频免费| 天天做日日爱| 91麻豆精品国产高清在线| 国产不卡精品一区二区三区| 国产伦精品一区三区视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 午夜久久网| 99久久精品国产片| 亚洲天堂免费观看| 精品国产三级a∨在线观看| 精品视频一区二区三区免费| 精品国产亚洲一区二区三区| 黄色福利片| 国产成人精品综合久久久| 欧美一级视| 精品在线免费播放| 久久精品大片| 九九精品在线播放| 久久精品道一区二区三区| 免费国产一级特黄aa大片在线| 免费国产在线观看| 美女免费黄网站| 色综合久久天天综合| 日韩专区第一页| 国产原创中文字幕| 欧美一区二区三区性| 日韩av成人| 99久久精品国产片| 欧美激情伊人| 成人免费一级纶理片| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 精品久久久久久影院免费| 精品国产一区二区三区久 | 国产综合成人观看在线| 精品视频在线看| 国产一区二区精品| 国产a网| 国产不卡福利| 亚久久伊人精品青青草原2020| 九九久久国产精品大片| 国产成人精品影视| 亚洲天堂免费观看| 国产91素人搭讪系列天堂| 成人免费观看的视频黄页| 成人免费观看的视频黄页| 国产a毛片| 日韩男人天堂| 日本在线www| 沈樵在线观看福利| 色综合久久天天综线观看| 九九久久国产精品大片| 国产精品123|