• 安装gstreamer开发依赖库到项目sysroot目录


    背景

    在项目中,需要实现一个gstreamer的pipeline,依赖libgstreamer1.0和libgstapp-1.0库,因为是系统是x86_64环境,需要在i386的sysroot下安装这些库,基于这个背景,发现通过apt安装,然后从apt安装的cache路径,拿到这些库解包后拷贝到sysroot目录是非常方便。

    首先,设置apt安装包时是否保留下载的deb包:

    # 禁止保存
    echo 'Binary::apt::APT::Keep-Downloaded-Packages "0";' | sudo tee /etc/apt/apt.conf.d/10apt-keep-downloads
    
    # 允许保存
    echo 'Binary::apt::APT::Keep-Downloaded-Packages "1";' | sudo tee /etc/apt/apt.conf.d/10apt-keep-downloads
    
    • 1
    • 2
    • 3
    • 4
    • 5

    执行第二条命令运行apt cache保存下载的deb包。

    libgstapp-1.0.so -> libgstapp-1.0.so.0.1602.0
    
    • 1

    解包libgstreamer1.0 & libgstapp-1.0

    通过dpkg-deb -X 解压缩就可以看到,libgstreamer1.0的库在libgstreamer1.0-0里面,而和libgstreamer1.0-dev里面存放的是头文件,pkg-config需要的pc文件和指向libgstreamer1.0-0里面的库的符号链接。

    建一个out目录,解包libgstreamer1.0-0_1.16.2-2_i386.deb到out目录,如下:

    $ dpkg -X libgstreamer1.0-0_1.16.2-2_i386.deb out
    ./
    ./usr/
    ./usr/lib/
    ./usr/lib/i386-linux-gnu/
    ./usr/lib/i386-linux-gnu/gstreamer-1.0/
    ./usr/lib/i386-linux-gnu/gstreamer-1.0/libgstcoreelements.so
    ./usr/lib/i386-linux-gnu/gstreamer-1.0/libgstcoretracers.so
    ./usr/lib/i386-linux-gnu/gstreamer1.0/
    ./usr/lib/i386-linux-gnu/gstreamer1.0/gstreamer-1.0/
    ./usr/lib/i386-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-plugin-scanner
    ./usr/lib/i386-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper
    ./usr/lib/i386-linux-gnu/libgstbase-1.0.so.0.1602.0
    ./usr/lib/i386-linux-gnu/libgstcheck-1.0.so.0.1602.0
    ./usr/lib/i386-linux-gnu/libgstcontroller-1.0.so.0.1602.0
    ./usr/lib/i386-linux-gnu/libgstnet-1.0.so.0.1602.0
    ./usr/lib/i386-linux-gnu/libgstreamer-1.0.so.0.1602.0
    
    # 符号链接
    ./usr/lib/i386-linux-gnu/libgstbase-1.0.so.0
    ./usr/lib/i386-linux-gnu/libgstcheck-1.0.so.0
    ./usr/lib/i386-linux-gnu/libgstcontroller-1.0.so.0
    ./usr/lib/i386-linux-gnu/libgstnet-1.0.so.0
    ./usr/lib/i386-linux-gnu/libgstreamer-1.0.so.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    从这个解包的输出可以看出,不带dev的deb包里面是全部的so库,包括符号链接。

    再建立out-dev目录,通过dpkg-deb -X命令解包libgstreamer1.0-dev到out-dev目录:

    $ dpkg-deb -X libgstreamer1.0-dev_1.16.2-2_i386.deb out-dev/
    
    # include需要的文件
    ./
    ./usr/
    ./usr/bin/
    ./usr/bin/dh_gstscancodecs
    ./usr/include/
    ./usr/include/gstreamer-1.0/
    ./usr/include/gstreamer-1.0/gst/
    ./usr/include/gstreamer-1.0/gst/base/
    ./usr/include/gstreamer-1.0/gst/base/base-prelude.h
    ./usr/include/gstreamer-1.0/gst/base/base.h
    ./usr/include/gstreamer-1.0/gst/base/gstadapter.h
    ./usr/include/gstreamer-1.0/gst/base/gstaggregator.h
    ./usr/include/gstreamer-1.0/gst/base/gstbaseparse.h
    ./usr/include/gstreamer-1.0/gst/base/gstbasesink.h
    ./usr/include/gstreamer-1.0/gst/base/gstbasesrc.h
    ./usr/include/gstreamer-1.0/gst/base/gstbasetransform.h
    ./usr/include/gstreamer-1.0/gst/base/gstbitreader.h
    ./usr/include/gstreamer-1.0/gst/base/gstbitwriter.h
    ./usr/include/gstreamer-1.0/gst/base/gstbytereader.h
    ./usr/include/gstreamer-1.0/gst/base/gstbytewriter.h
    ./usr/include/gstreamer-1.0/gst/base/gstcollectpads.h
    # ...
    
    
    # pkg-config的pc文件
    ./usr/lib/
    ./usr/lib/i386-linux-gnu/
    ./usr/lib/i386-linux-gnu/gstreamer1.0/
    ./usr/lib/i386-linux-gnu/gstreamer1.0/gstreamer-1.0/
    ./usr/lib/i386-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-codec-info-1.0
    ./usr/lib/i386-linux-gnu/pkgconfig/
    ./usr/lib/i386-linux-gnu/pkgconfig/gstreamer-1.0.pc
    ./usr/lib/i386-linux-gnu/pkgconfig/gstreamer-base-1.0.pc
    ./usr/lib/i386-linux-gnu/pkgconfig/gstreamer-check-1.0.pc
    ./usr/lib/i386-linux-gnu/pkgconfig/gstreamer-controller-1.0.pc
    ./usr/lib/i386-linux-gnu/pkgconfig/gstreamer-net-1.0.pc
    
    # 这些库只是符号链接
    ./usr/lib/i386-linux-gnu/libgstbase-1.0.so
    ./usr/lib/i386-linux-gnu/libgstcheck-1.0.so
    ./usr/lib/i386-linux-gnu/libgstcontroller-1.0.so
    ./usr/lib/i386-linux-gnu/libgstnet-1.0.so
    ./usr/lib/i386-linux-gnu/libgstreamer-1.0.so
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    完成这些验证,就可以把这个过程应用到我们的环境中,比如我们的环境sysroot路径是./i386-sysroot/

    
    # step 1: 安装libgstreamer1.0库
    
    sudo apt install libgstreamer1.0-0:i386
    sudo apt install libgstreamer1.0-dev:i386
    
    
    cp /var/cache/apt/archives/libgstreamer1.0-0_1.16.2-2_i386.deb .
    cp /var/cache/apt/archives/libgstreamer1.0-dev_1.16.2-2_i386.deb .
    dpkg-deb -X libgstreamer1.0-0_1.16.2-2_i386.deb ./i386-sysroot/
    dpkg-deb -X libgstreamer1.0-dev_1.16.2-2_i386.deb ./i386-sysroot/
    
    
    
    # step 2:安装libgstreamer-plugins-base1.0库
    
    sudo apt install libgstreamer-plugins-base1.0-0:i386
    sudo apt install libgstreamer-plugins-base1.0-dev:i386
    
    cp /var/cache/apt/archives/libgstreamer-plugins-base1.0-0_1.16.2-4ubuntu0.1_i386.deb .
    cp /var/cache/apt/archives/libgstreamer-plugins-base1.0-dev_1.16.2-4ubuntu0.1_i386.deb .
    
    dpkg-deb -X libgstreamer-plugins-base1.0-0_1.16.2-4ubuntu0.1_i386.deb ./i386-sysroot/
    dpkg-deb -X libgstreamer-plugins-base1.0-dev_1.16.2-4ubuntu0.1_i386.deb ./i386-sysroot/
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    完成上面两个步骤,sysroot中依赖gstreamer的开发环境就配置好了,如果需要其他的依赖也可以按此操作。

    在ubuntu上,libgstreamer1.0-0这个名字可以通过apt search获得,比如:

    $ apt search gstreamer
    
    libgstreamer1.0-0/focal,now 1.16.2-2 amd64 [installed,automatic]
      Core GStreamer libraries and elements
      
    libgstreamer1.0-dev/focal 1.16.2-2 amd64
      GStreamer core development files  
      
    libgstreamer-plugins-base1.0-0/focal-updates,focal-security,now 1.16.2-4ubuntu0.1 amd64 [installed,automatic]
      GStreamer libraries from the "base" set
    
    libgstreamer-plugins-base1.0-dev/focal-updates,focal-security 1.16.2-4ubuntu0.1 amd64
      GStreamer development files for libraries from the "base" set
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    安装的时候后面加上i386安装的就是32位的版本。

    sudo apt install libgstreamer1.0-0:i386
    sudo apt install libgstreamer1.0-dev:i386
    
    • 1
    • 2

    📣 附dpkg-deb命令解释

    dpkg-deb命令是Debian Linux下的软件包管理工具,可以对软件包执行打包和解包操作。

    -X:将软件包中的文件释放到指定目录下,并显示释放文件的详细过程

  • 相关阅读:
    SpringCloudAlibaba SpringCloud SpringBoot 版本对照
    tensorflow 使用tf.where编辑tensor的每个值
    各位同志,Android studio打不开,提示什么动态链接库
    模型分类model
    9.5 利用可执行内存挑战DEP
    Blender vs 3ds Max:谁才是3D软件的未来
    kafka 3.0 跟着b站尚硅谷老师学习。(有需要zookeeper的配置(2.8之前)和Kraft(2.8之后))
    【mac前端开发环境】
    JavaScript学习笔记——JS基础6
    Android面试题汇总(三)
  • 原文地址:https://blog.csdn.net/hongszh/article/details/126040020