环境:Ubuntu18.04,gcc/g++ version>8.0, OpenCV version==3.4, Bazel version==3.7.2

1、安装Bazel

见官方文档:Installing Bazel using Bazelisk - Bazel main

2、下载MedianPipe源码

git clone https://github.com/google/mediapipe.gitcd mediapipe

3、安装OpenCV和FFmpeg

MedianPipe源码根目录中有写好的脚本setup_opencv.sh,但是在执行的时候很多opencv的前置依赖项并未安装,导致编译不通过;

参照此文章OpenCV-3编译安装方法及常见错误解决(Ubuntu平台) - 尚码园 安装前置依赖方可正常编译通过。

建议第一次编译不通过时,将setup_opencv.sh下载的opencv3.4和对应的contrib文件备份,同时注释下面几行代码:

    #rm -rf /tmp/build_opencv#mkdir /tmp/build_opencvcd /tmp/build_opencv#git clone git://github.com/opencv/opencv_contrib.git#git clone git://github.com/opencv/opencv.git

cmake .. 后面的选项加上 -DWITH_V4AL=OFF -DWITH_LIBV4L=ON

4、GCC版本问题

ubuntu18.04自带gcc-7.5,编译MediaPipe 的HellowWorld Demo没有问题,但是要进行手势识别的编译,就会报错:

ERROR: /home/ubuntu/mediapipe/mediapipe/calculators/tensor/BUILD:657:11: C++ compilation of rule '//mediapipe/calculators/tensor:image_to_tensor_converter_o
pencv' failed (Exit 1): gcc failed: error executing command /usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonh
eap-object -fno-omit-frame-pointer -g0 -O2 '-D_FORTIFY_SOURCE=1' -DNDEBUG -ffunction-sections ... (remaining 57 argument(s) skipped)Use --sandbox_debug to see verbose messages from the sandbox gcc failed: error executing command /usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -Wun
used-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer -g0 -O2 '-D_FORTIFY_SOURCE=1' -DNDEBUG -ffunction-sections ... (remaining 57 argumen
t(s) skipped)Use --sandbox_debug to see verbose messages from the sandbox
mediapipe/calculators/tensor/image_to_tensor_converter_opencv.cc: In member function 'virtual absl::lts_20210324::StatusOrmediapipe::Tensor mediapipe::{an
onymous}::OpenCvProcessor::Convert(const mediapipe::Image&, const mediapipe::RotatedRect&, const mediapipe::Size&, float, float)':
mediapipe/calculators/tensor/image_to_tensor_converter_opencv.cc:106:12: error: could not convert 'tensor' from 'mediapipe::Tensor' to 'absl::lts_20210324::
StatusOrmediapipe::Tensor'
return tensor;
^~~~~~
Target //mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu failed to build

原因就是gcc版本过低,

//mediapipe/calculators/tensor:image_to_tensor_converter_gl_buffer · Issue #1684 · google/mediapipe · GitHub

更新gcc、g++至8.0版本之后即可解决该问题;

接下来再编译手势识别代码可能遇到:

[ERROR]
/home/base/.cache/bazel/_bazel_base/10f4be354af48e783fcaf1c23632155f/external/com_google_absl/absl/types/BUILD.bazel:54:11: undeclared inclusion(s) in rule '@com_google_absl//absl/types:bad_any_cast_impl':
this rule is missing dependency declarations for the following files included by 'com_google_absl/absl/types/bad_any_cast.cc':
'/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h'
'/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h'
'/usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h'
Target //mediapipe/examples/desktop/libexample:libexample.so failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 1.981s, Critical Path: 0.28s
INFO: 106 processes: 106 internal.
FAILED: Build did NOT complete successfully

这是因为之前使用gcc-7.5版本编译,~/.cache/bazel中保留了7.5版本的缓存,直接升级gcc-8/9后,出现版本不对应的问题;解决方法:删除该文件夹。

接下来再次编译,可能遇到问题:

ERROR: /home/base/workspace/mediapipe/mediapipe/examples/desktop/hand_tracking/BUILD:27:10: Linking of rule '//mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu' failed (Exit 1): gcc failed: error executing command /usr/bin/gcc @bazel-out/k8-opt/bin/mediapipe/examples/desktop/hand_tracking/hand_tracking_cpu-2.params

原因:opencv三方库没有全部链接上,修改opencv_linux.BUILD中的链接选项即可。

5、lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line

/home/base/workspace/mediapipe/mediapipe/framework/tool/BUILD:107:10: Linking of rule '//mediapipe/framework/tool:encode_as_c_string' failed (Exit 1): crosstool_wrapper_driver_is_not_gcc failed: error executing command external/local_config_cuda/crosstool/clang/bin/crosstool_wrapper_driver_is_not_gcc @bazel-out/host/bin/mediapipe/framework/tool/encode_as_c_string-2.params
/usr/bin/ld: bazel-out/host/bin/external/com_google_absl/absl/strings/libstrings.a(charconv.o): undefined reference to symbol 'nan@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line

但是,由于对bazel编译工具不熟悉,找不到对应链接库的位置,无法解决该问题;经过查找,找到了类似解答:

Undefined reference to symbol 'ceil@@GLIBC_2.2.5' at build time · Issue #1171 · tensorflow/tensorflow · GitHub

undefined reference to symbol xx@@GLIBC_2.2.5 - 海滨银枪小霸王 - 博客园

c - ld: undefined reference to symbol 'log2@@GLIBC_2.2.5' - Stack Overflow

Issue in TensorFlow CUDA Support on Jetson Nano · Issue #852 · google/mediapipe · GitHub

最后在mediapipe找到了和我一模一样的问题,由于他遇到了前置问题,我没能第一时间发现他后面写的问题描述。

所有问题解决方法均指向了这条解决方式:

而和我相同问题的兄弟说:

没错:在mediapipe/BUILD at master · google/mediapipe · GitHub这里加上一句linkopts = ["-lm"],(注意有逗号)即可解决问题,而这坑爹的103行其实并不是当时的那一行,所以加入只会报错。但是这个方法确实是对的,需要在编译的时候加入对应的链接库。

回头再看error内容:

第一句

/home/base/workspace/mediapipe/mediapipe/framework/tool/BUILD:107:10: Linking of rule '//mediapipe/framework/tool:encode_as_c_string' failed (Exit 1):

实际encode_as_c_string在 110行;

第二句

查看 bazel-out/host/bin/mediapipe/framework/tool/encode_as_c_string-2.params

这里-pthread等就是加入的编译相关链接库,直接在后面加入-lm试试;编译同时提示内容已经发生改变,再回头看看报错信息:

Linking of xxx/tool:encode_as_c_string error

原来是/home/base/workspace/mediapipe/mediapipe/framework/tool/BUILD中的encode_as_c_string这段需要补上对应的链接库

cc_binary(name = "encode_as_c_string",srcs = ["encode_as_c_string.cc"],visibility = ["//visibility:public"],deps = ["@com_google_absl//absl/strings",],
)

所以在里面加入    linkopts = ["-lm"], (注意有英文逗号)。

修改后编译生成的

bazel-out/host/bin/mediapipe/framework/tool/encode_as_c_string-2.params

中新加入了 -lm, 即可解决该问题。

Linux MediaPipe C++版手势识别环境搭建与编译相关推荐

  1. 小知识点:ARM 架构 Linux 大数据集群基础环境搭建(Hadoop、MySQL、Hive、Spark、Flink、ZK、Kafka、Nginx、Node)

      换了 M2 芯片的 Mac,以前 x86 版本的 Linux 大数据集群基础环境搭建在 ARM 架构的虚拟机集群上有些用不了了,现在重新写一份基于 ARM 架构的,少数不兼容之外其他都差不多,相当 ...

  2. 【Linux Mint 深度学习开发环境搭建】开发软件安装

    系列文章目录 第一章 Linux mint 深度学习开发环境搭建之Nvidia显卡相关软件安装 第二章 Linux mint 深度学习开发环境搭建之开发软件安装 第三章 Linux mint 深度学习 ...

  3. linux 下51单片机开发环境搭建

    linux 下51单片机开发环境搭建(arch linux) 编译sdcc 软件: sdcc 命令:sdcc file.c 得到一堆文件需要( .inx) 命令: packihx file.inx & ...

  4. Linux 下的 ActiveMQ C++ 环境搭建与测试

    Linux 下的 ActiveMQ C++ 环境搭建与测试 一.下载安装jdk jdk官网下载地址:https://www.oracle.com/technetwork/java/javase/dow ...

  5. linux设备驱动开发之环境搭建(基于exynos4412)

    第一章 linux设备驱动开发之环境搭建(基于exynos4412) 目录 第一章 linux设备驱动开发之环境搭建(基于exynos4412) 1.搭建开发板运行环境 1.1.交叉开发模式 安装交叉 ...

  6. 高通Android智能平台环境搭建_编译流程分析

    高通Android智能平台环境搭建_编译流程分析 高通平台环境搭建,编译,系统引导流程分析 TOC \o \h \z \u 1. 高通平台android开发总结. 7 1.1 搭建高通平台环境开发环境 ...

  7. -i 可以编译添加多个_大咖说 | 基于 NXP i.MX8 eIQ 环境搭建和编译

    一.前言 NXP 针对 Machine Learning ( ML ) 创建了 eIQ 工具,以方便开发者在 i.MX 系列设备上开发 ML 相关应用. 本篇将会分两个章节,一章节介绍 eIQ 软件, ...

  8. 高通平台开发环境搭建、编译、烧录(android5.1以上系统)

    高通平台开发环境搭建.编译.烧录(android5.1以上系统) 以MSN8937为例 1. 安装Ubuntu(12.04LTS以上稳定版本)     安装过程中必须以根用户登录或使用sudo获取ro ...

  9. FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译

    FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, M ...

最新文章

  1. 趣味图形之 余弦函数cos与直线相交(另一种相交)
  2. 理解MapReduce
  3. matlab画梅花,基于Matlab图像素描生成算法究.doc
  4. node实战学习纪录
  5. oracle大对象实例_Oracle解析复杂json的方法实例详解
  6. lintcode: 跳跃游戏 II
  7. 解决larave-dompdf中文字体显示问题
  8. 统计vs机器学习,数据领域的“少林和武当”!
  9. jq事件不自执行方法
  10. Android异步载入AsyncTask具体解释
  11. 安卓程序代写 网上程序代写[原]Android开发技巧--ListView
  12. H.264学习过程中遇到的英文缩写整理
  13. Ubalun电动牙刷拆卸及内部刨析
  14. 2022NISCTF--web
  15. 文件夹排序(先文件夹排序,后文件排序)
  16. 在cmd中遍历局域网内的IP命令解析
  17. so-vits-svc4.0 中文详细安装、训练、推理使用教程
  18. “华为杯”第一届中国研究生网络安全创新大赛
  19. 程序员的核心竞争力分享
  20. 什么是反向代理服务器

热门文章

  1. 易经与计算机科学,人与计算机的思维模式区别,以及计算机的易经八卦运算
  2. 量子计算机与易经,易经卦象的演化过程,就是一个量子计算机模型?
  3. 蚂蚁金服暂缓上市,程序IT圈炸了
  4. 2014 微软校招笔试答案 编程题
  5. 霍涛的HashMap由 数组 + 链表 组成
  6. 【LeetCode】77. Combinations 解题报告(Python C++)
  7. 云计算服务模型,第 2 部分: 平台即服务(PaaS)
  8. kubernetes指令合集
  9. STM32串口读取一帧数据USART_IT_IDLE
  10. 欧盟将启动超40亿欧元投资,提升数字经济领域竞争力