gstreamer移植qnx(二):交叉编译glib

2023-05-16

一、简介

​ 这里以glib的2.63.0版本,QNX系统的版本是:6.6 。这里是为了编译gstreamer的依赖库,也就是说最终目标,是将gstreamer移植到QNX6.6系统上。 我选择的是gstreamer 1.16,他需要的glib版本是2.40以上,因此就索性使用最新的glib版本。 编译用的host系统是Ubuntu18.04。

二、准备cross-file

​ 因为最新的glib其构建系统是使用的meson, 而我们这边是要交叉编译,所以需要准备一个cross-file的来配置交叉编译工具链

2.1 填写工具链

​ 首先是需要填写CPU和系统信息,以及工具链信息, 顺便还可以填写编译完成之后,安装的目录,其内容如下:

[host_machine]
system = 'qnx'
cpu_family = 'arm'
cpu = 'armv7'
endian = 'little'

[binaries]
c = 'arm-unknown-nto-qnx6.6.0eabi-gcc'
cpp = 'arm-unknown-nto-qnx6.6.0eabi-g++'
ar = 'arm-unknown-nto-qnx6.6.0eabi-ar'
strip = 'arm-unknown-nto-qnx6.6.0eabi-strip'

[paths]
prefix = '/media/guwen/workspace/project/gstreamer/out'
      

2.2 填写编译flag信息

​ 第一个就是需要定义一个 _QNX_SOURCE宏,不然在编译和POSIX thread相关的部分时,就会出现“error: #error POSIX Scheduling needs P1003.1b-1993 or later” 这类似的错误。

[properties]
c_args = ['-D_QNX_SOURCE=1']
c_link_args = []

修改之后的完整版cross-file文件,qnx_arm.txt如下所示:

host_machine]
system = 'qnx'
cpu_family = 'arm'
cpu = 'armv7'
endian = 'little'


[binaries]
c = 'arm-unknown-nto-qnx6.6.0eabi-gcc'
cpp = 'arm-unknown-nto-qnx6.6.0eabi-g++'
ar = 'arm-unknown-nto-qnx6.6.0eabi-ar'
strip = 'arm-unknown-nto-qnx6.6.0eabi-strip'


[properties]
c_args = ['-D_QNX_SOURCE=1']
c_link_args = []


[paths]
prefix = '/media/guwen/workspace/project/gstreamer/out'

三、 修改meson.build

​ 因为某些特性,qnx6.6的toolchain里面没有,比如xattr, 因此这里需要修改meson的option选项,这里有两种方式:

  • 直接在meson的命令行参数,以 -Dxattr=false的方式进
  • 修改glib里面的meson.build文件里面default_options部分

​ 这里为了方便,就选择了修改meson.build 文件,免得每次敲命令 都要带一长串参数。 当然,也可以把这个配置过程写到一个shell脚本里面。

​ 修改后的default_options如下所示:

  default_options : [
    'buildtype=release',
    'warning_level=1',
    'c_std=gnu99',
    'xattr=false',
    'force_posix_threads=true',
    'libmount=false'
  ]  
  

​ qnx的libintl没有ngettext这个函数,因此需要使用glib自带的libintl库,

​ 修改前的原始版本:

# First check in libc, fallback to libintl, and as last chance build
# proxy-libintl subproject.
# FIXME: glib-gettext.m4 has much more checks to detect broken/uncompatible
# implementations. This could be extended if issues are found in some platforms.
if cc.has_function('ngettext')
  libintl = []
  have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset')
else
  libintl = cc.find_library('intl', required : false)
  if not libintl.found()
    libintl = subproject('proxy-libintl').get_variable('intl_dep')
    have_bind_textdomain_codeset = true  # proxy-libintl supports it
  else
    have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset',
                                                  dependencies : libintl)
  endif
endif

​ 修改之后的版本:

# First check in libc, fallback to libintl, and as last chance build
# proxy-libintl subproject.
# FIXME: glib-gettext.m4 has much more checks to detect broken/uncompatible
# implementations. This could be extended if issues are found in some platforms.
if cc.has_function('ngettext')
  libintl = []
  have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset')
else
  #libintl = cc.find_library('intl', required : false)
  #if not libintl.found()
    libintl = subproject('proxy-libintl').get_variable('intl_dep')
    have_bind_textdomain_codeset = true  # proxy-libintl supports it
  #else
  #  have_bind_textdomain_codeset = cc.has_function('bind_textdomain_codeset',
  #                                                 dependencies : libintl)
  #endif
endif

四、修改 gio目录下的内容

4.1 修改gio目录下的meson.build

​ 因为qnx里面没有libresolv,也没有libbind, res_query函数是在libsocket库里面。因此需要修改gio目录下的meson.build文件。

原始内容如下:

if host_system != 'windows'
  # res_query()
  res_query_test = '''#include <resolv.h>
                      int main (int argc, char ** argv) {
                        return res_query("test", 0, 0, (void *)0, 0);
                      }'''
  res_query_test_full = '''#include <sys/types.h>
                           #include <netinet/in.h>
                           #include <arpa/nameser.h>
                        ''' + res_query_test
  if not cc.links(res_query_test_full, name : 'res_query()')
    if cc.links(res_query_test_full, args : '-lresolv', name : 'res_query() in -lresolv')
      network_libs += [ cc.find_library('resolv') ]
      network_args += [ '-lresolv' ]
    elif cc.links(res_query_test, args : '-lbind', name : 'res_query() in -lbind')
      network_libs += [ cc.find_library('bind') ]
      network_args += [ '-lbind' ]
    else
      error('Could not find res_query()')
    endif
  endif

  # socket()
  socket_test = '''#include <sys/types.h>
                   #include <sys/socket.h>
                   int main (int argc, char ** argv) {
                     return socket(1, 2, 3);
                   }'''
  if not cc.links(socket_test, name : 'socket()')
    if cc.links(socket_test, args : '-lsocket', name : 'socket() in -lsocket')
      network_libs += [ cc.find_library('socket') ]
      network_args += [ '-lsocket' ]
    else
      error('Could not find socket()')
    endif
  endif

修改之后如下:

if host_system != 'windows'
  # res_query()
  res_query_test = '''#include <resolv.h>
                      int main (int argc, char ** argv) {
                        return res_query("test", 0, 0, (void *)0, 0);
                      }'''
  res_query_test_full = '''#include <sys/types.h>
                           #include <netinet/in.h>
                           #include <arpa/nameser.h>
                        ''' + res_query_test
  if not cc.links(res_query_test_full, name : 'res_query()')
    if cc.links(res_query_test_full, args : '-lsocket', name : 'res_query() in -lsocket')
      network_libs += [ cc.find_library('socket') ]
      network_args += [ '-lsocket' ]
    elif cc.links(res_query_test, args : '-lbind', name : 'res_query() in -lbind')
      network_libs += [ cc.find_library('bind') ]
      network_args += [ '-lbind' ]
    else
      error('Could not find res_query()')
    endif
  endif

  # socket()
  socket_test = '''#include <sys/types.h>
                   #include <sys/socket.h>
                   int main (int argc, char ** argv) {
                     return socket(1, 2, 3);
                   }'''
  if not cc.links(socket_test, name : 'socket()')
    if cc.links(socket_test, args : '-lsocket', name : 'socket() in -lsocket')
      network_libs += [ cc.find_library('socket') ]
      network_args += [ '-lsocket' ]
    else
      error('Could not find socket()')
    endif
  endif

4.2 修改gunixmounts.c

​ 因为glib没有实现qnx平台的 _g_get_unix_mounts 和 _g_get_unix_mount_points 以及get_mtab_monitor_file 函数,因此编译会出现如下错误:

…/gio/gunixmounts.c:954:2: error: #error No _g_get_unix_mounts() implementation for system
…/gio/gunixmounts.c:1477:2: error: #error No g_get_mount_table() implementation for system

​ 因此需要在 954行和1477行添加qnx版本的的实现,其实也不是实现,就是留个空,代码如下:

//在954行添加
/* Common code {{{2 */
#elif defined(__QNX__)
static GList* _g_get_unix_mounts (void)
{
    return NULL;
}

static const char* get_mtab_monitor_file (void)
{
	return NULL;
}

#else
#error No _g_get_unix_mounts() implementation for system
#endif


//在1477行添加
/* Common code {{{2 */
#elif defined(__QNX__)
static GList * _g_get_unix_mount_points (void)
{
    return NULL;
}

#else
#error No g_get_mount_table() implementation for system
#endif

五、编译过程

  • 新建build目录并进入build目录:
mkdir build
cd build
  • meson配置
meson .. --cross-file ../qnx_arm.txt
  • ninja编译和安装
ninja
ninja install
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gstreamer移植qnx(二):交叉编译glib 的相关文章

  • 如何使用 gstreamer 从较长源的片段中制作音频剪辑?

    我想使用 gstreamer 将一个音频文件中的任意剪辑保存到一个新文件中 比如原著中1分钟到2分钟的片段 我该怎么做 你需要gnonlin http wiki pitivi org wiki GNonLin documentation S
  • 如何定量测量源和显示器之间的 gstreamer H264 延迟?

    我有一个项目 我们使用 gstreamer x264 等将视频流通过本地网络多播到多个接收器 连接到显示器的专用计算机 我们在视频源 摄像机 系统和显示监视器上使用 gstreamer 我们使用 RTP 有效负载 96 和 libx264
  • gstreamer playbin - 在 Windows 上设置 uri

    我正在尝试使用此站点上的 CLI 示例播放一些音频文件 http pygstdocs berlios de pygst tutorial playbin html http pygstdocs berlios de pygst tutori
  • Python从视频文件中提取wav

    Related 如何使用python从视频文件中提取音频 https stackoverflow com questions 19216450 how to extract audio from a video file using pyt
  • 带 PyGTK 崩溃的多线程 Gstreamer (xcb_xlib_threads_sequence_lost)

    我知道不应该从其他线程更新 UIgtk 或面临后果 但我不确定在使用时如何避免这种情况gstreamer 我的应用程序在视频流初始化期间有时会崩溃 并出现以下投诉 xcb Unknown sequence number while proc
  • 在 Gstreamer 上流式传输 MP4 视频文件

    我第一次使用 gstreamer 并尝试使用 Gstreamer RTP 和 UDP 将 MP4 视频文件从服务器流式传输到客户端 我尝试使用的命令行 在服务器端 gst launch 1 0 v filesrc location file
  • 将多个视频合并为一个

    我有三个视频 用摄像机拍摄的讲座 讲座中使用的计算机的桌面捕获视频 和白板的视频 我想创建一个最终视频 其中这三个组件占据屏幕的特定区域 是否有开源软件可以让我做到这一点 mencoder ffmpeg virtualdub 你推荐哪一个
  • 32 位编译在 64 位 Ubuntu 16.04 上失败

    我有一个应用程序需要使用 glib 和第三方提供的 32 位库 当我在 32 位 Ubuntu 上编译时 应用程序构建并成功运行 但是 当我在 64 位 Ubuntu 上尝试相同的操作时 由于以下错误而无法构建 usr include gl
  • gstreamer:如何改变从文件中获取的一个流的渲染时间

    我有两个媒体文件 例如 file0 和 file1 我想将它们合并成一个具有 画中画 效果的单个 file0 中的内容要显示在整个窗口上 并且 file1 中的内容将显示在左上角 较小的盒子 还有一点是 file1 中的内容应该被渲染 从基
  • Gstreamer - Android 上的硬件加速视频解码

    我在 Android 手机上通过 RTP UDP 接收视频 但我发现 CPU 使用率非常高 几乎 100 的一个核心都用于解码视频 在高端设备上 视频播放几乎流畅 但在中低端设备上 我几乎每秒无法获得 1 帧 这是一个 H 264 视频流
  • make:安装:找不到命令

    当我尝试安装时git从它的源头开始qnx 我收到以下错误 请注意 pound 是 sudo 的提示qnx configure without iconv with perl usr pkg bin perl with python usr
  • 如何删除 GCC 4.6 中的警告:“缺少初始化程序 [-Wmissing-field-initializers]”?

    The code GValue value 0 给出以下警告 缺少初始化程序 Wmissing field initializers 我知道那是一个GCC bug https stackoverflow com questions 1538
  • 如何查看 gstreamer 调试输出?

    如何查看 GST CAT INFO GST DEBUG 等函数的输出 我是否需要自己使用调试级别设置来编译 gstreamer 还是可以在应用程序级别完成 可以使用 GST DEBUG 环境变量在 stderr 中打印调试消息 如果 gst
  • 如何使用 MinGW 运行 ./configure?

    我正在看这个网页 http mathieu carbou free fr wiki index php title Glib for Win32 http mathieu carbou free fr wiki index php titl
  • 线程中的 GLib GMainContext?

    我在堆栈溢出上搜索以找到与我的问题相关的答案 但我没有找到任何答案 我有一个启动线程的主线程 我的 main 函数 新线程运行 GMainLoop 在我的主要功能中 我不断通过调用添加源g io watch一些文件描述符 但如果事件被调度
  • Gstreamer multifilesink wav 文件分割

    我在使用 gstreamer 录制流时遇到问题 我必须分别编写音频和视频 并在信号到达时切入 我的视频工作正常 但 wav 文件仍然存在问题 即使 gst launch 中的简单管道也无法正常工作 我有波形文件 我正在尝试使用 multif
  • 警告:错误的管道:没有元素“x264enc”

    过去几天我一直在努力让它运行 我有一个需要 x264enc 的 gstreamer 命令 我正在运行一个Mac我似乎无法安装 x264 开发库 我已经安装了gst plugins bad但这没有帮助 我在论坛中读到 在安装之前我需要先安装
  • C程序中包含的头文件的默认路径是什么?

    看看我是否在任何 c 文件中写入 include header h 然后它会在当前目录中搜索该文件 但是当我写的时候 include
  • 在 Ubuntu 中使用 Gstreamer 通过 RTP 协议流式传输 Mp4 视频

    我正在尝试从本地目录获取视频文件 启用来自服务器的流并从客户端捕获这些帧 我使用了以下管道 服务器端 gst launch v filesrc location home gokul Videos Econ TestVideo radioa
  • ImportError:无法导入名称 GstRtspServer,未找到内省类型库

    我目前正在尝试让一个简单的 GstRtspServer 程序在外部亚马逊 Linux EC2 服务器上运行 但在让它实际运行时遇到了严重的问题 无论我做什么 当我尝试运行它时 即使程序仅减少到 import gi gi require ve

随机推荐

  • PHP实现上一页下一页翻页代码实例

    lt php 1 xff0c 将数据库的所有记录查询出来 xff0c 然后再一页一页的显示 link 61 mysql connect 39 localhost 39 39 root 39 39 123 39 mysql select db
  • QT项目升级(QT4.6.3到QT5.2)时,遇到的问题和解决方法

    QT4 升级到 QT5 改动 PC部分 xff1a 改 QTDIR 变量 在工程根目录下找到 user 文件 如 InnoTabPlugin vcxproj user 修改指向你的 QT5 根目录 xff1a lt PropertyGrou
  • c++中ifstream一次读取整个文件

    c 43 43 中一次读取整个文件的内容的方法 xff1a 1 读取至char 的情况 cpp view plain copy std ifstream t int length t open 34 file txt 34 open inp
  • webkit/chromuim/CEF3介绍

    一 浏览器主要构成 浏览器的主要构成High Level Structure 浏览器的主要组件包括 xff1a 1 用户界面 xff0d 包括地址栏 后退 前进按钮 书签目录等 xff0c 也就是你所看到的除了用来显示你所请求页面的主窗口之
  • python多文件使用同一个全局变量的定义和使用方法

    Python是一种面向对象的开发语言 xff0c 在函数中使用全局变量 xff0c 一般应作全局变量说明 xff0c 只有在函数内经过说明的全局变量才能使用 xff0c 下面介绍下Python全局变量有关问题 应该尽量避免使用Python全
  • D3VO 2020CVPR论文阅读

    Deep Depth Deep Pose and Deep Uncertainty for Monocular Visual Odometry 论文链接 摘要 xff1a 提出的D3VO单目视觉里程计框架从三个层面上利用了深度学习网络 xf
  • python在windows下获取cpu、硬盘、bios、主板序列号

    此处使用的是wmi库 xff0c 可以去google里面搜索 python wmi import os sys import time import wmi zlib def get cpu info tmpdict 61 tmpdict
  • gcc中调试代码常用的宏

    红色是比较常用的 宏 意义 FILE 本文件名 LINE 本行位于该文件的第几行 FUNCTION 函数名 PRETTY FUNCTION c语言中和同上 xff0c C 43 43 中稍有区别 VA ARGS 格式化输出 VA ARGS
  • Qt基础学习(5)-----抽屉效果之QToolBox

    cpp view plain copy print mydialog h ifndef MYDIALOG H define MYDIALOG H include lt QDialog gt class QToolBox class MyDi
  • linux下c语言抓包库libpcap

    安装命令 xff1a sudo apt get install libpcap dev 由于自己还没仔细研究过 xff0c 暂时也只是想在这里留个记录 xff0c 方便以后需要时使用 下面是百度百科里的例子 include lt pcap
  • scons简易手册

    在编译大程序时免不了要写个makefile来管理 xff0c 但是makefile的规则对于大多数人来说都还太复杂了 于是我找到了autotools工具 xff0c 尽管方便了一些 xff0c 但是还是不够傻瓜 目前scons是我用过最傻瓜
  • Round-Robin负载均衡算法及其实现原理

    第一次在pjsip协议栈中了解到这个实习负载均衡的机制 于是网上查了下资料 xff0c 下面的介绍应该可以很容易理解 轮询调度算法 Round Robin Scheduling 轮询调度算法的原理是每一次把来自用户的请求轮流分配给内部中的服
  • tipc协议详解

    TIPC协议和实现解析 1 TIPC简介TIPC是爱立信公司提出的一种透明进程间通信协议 主要适用于高可用 HAL 和动态集群环境 该软件当前主要由风河 windriver 公司在维护 主要支持Linux Solaris 和 VxWorks
  • python循环方法总结

    1 for循环 语法 xff1a for x in range xff08 100 xff09 补充 xff1a rang xff08 100 xff09 xff1a 数据范围0 99 range xff08 1 xff0c 100 xff
  • Ftp 线程池方式 解决多线程问题

    FTP 线程池 方式 解决多线程问题 1 pom xml中添加依赖 lt ftp gt lt dependency gt lt groupId gt commons net lt groupId gt lt artifactId gt co
  • cannot connect to X server localhost:10.0

    使用SSH连接服务器时 xff0c 打开图形界面 xff0c 若报错 xff1a cannot connect to X server localhost 10 0 可以通过如下设置 xff0c 显示图形界面 xff1a export DI
  • 【VPS + ORB-SLAM2】多人使用手机协同操作调研思考

    1 ORB SLAM3 43 深度学习开源调研 ORB SLAM3 with Docker xff1a https github com petrikvladimir orbslam3 docker 特点 xff1a ORB SLAM3 w
  • 最极致Windows仿Mac2.0【win11可用】——30分钟完成(W001)

    本文原创 禁止转载 2021年12月26日2 0 更新兼容性及bug修复 加图 2022年6月 更改邮箱 2022年12月 投放下载链接 2023年4月16日 更新链接 添加联系方式 喜欢的点个赞再拿走啊啊啊 不看消息 有问题加QQ群 群号
  • 简单介绍阿里内部工具——Arthas

    在阿里巴巴内部 xff0c 有很多自研工具供开发者使用 xff0c 其中有一款工具 xff0c 是几乎每个Java开发都使用过的工具 xff0c 那就是Arthas xff0c 这是一款Java诊断工具 xff0c 是一款牛逼带闪电的工具
  • gstreamer移植qnx(二):交叉编译glib

    一 简介 这里以glib的2 63 0版本 xff0c QNX系统的版本是 xff1a 6 6 这里是为了编译gstreamer的依赖库 xff0c 也就是说最终目标 xff0c 是将gstreamer移植到QNX6 6系统上 我选择的是g