在 petalinux 中编译 gstreamer 应用程序时出错

Posted

技术标签:

【中文标题】在 petalinux 中编译 gstreamer 应用程序时出错【英文标题】:Error compiling gstreamer app in petalinux 【发布时间】:2020-05-13 03:17:19 【问题描述】:

我正在尝试使用以下头文件在 petalinux 中编译自定义 gstreamer 应用程序:

#include <stdlib.h>
#include <string.h>
#include <gst/gst.h>
#include <gio/gio.h>

petalinux 项目在运行后已经填充了 sysroot 库源:

petalinux-build --sdk
petalinux-package --sysroot

但是编译应用程序(petalinux-build -c myapp)我得到了下一个错误:

| myapp.c:25:10: fatal error: gst/gst.h: No such file or directory
|  #include <gst/gst.h>
|           ^~~~~~~~~~~
| compilation terminated.

make 文件是:

APP = myapp

# Add any other object files to this list below
APP_OBJS = myapp.o

all: build

build: $(APP)

$(APP): $(APP_OBJS)
    $(CC) $(LDFLAGS) -o $@ $(APP_OBJS) $(LDLIBS)

clean:
    -rm -f $(APP) *.elf *.gdb *.o

%.o : %.c
    $(CC) -c $(CFLAGS) -o $@ $< $(shell pkg-config --cflags --libs gstreamer-1.0 glib-2.0)

还有配方:

#
# This file is the myapp recipe.
#

SUMMARY = "Simple myapp application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://$COMMON_LICENSE_DIR/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://myapp .c \
       file://Makefile \
          "

S = "$WORKDIR"

do_compile() 
         oe_runmake


do_install() 
         install -d $D$bindir
         install -m 0755 myapp $D$bindir

有谁知道我缺少什么以及如何正确添加 gstreamer 路径以进行编译?

编辑

按照建议,我在配方中添加了 DEPENDS 行:

#
# This file is the myapp recipe.
#

SUMMARY = "Simple myapp application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://$COMMON_LICENSE_DIR/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://myapp .c \
       file://Makefile \
          "

S = "$WORKDIR"

DEPENDS = "glib-2.0 gstreamer1.0"
RDEPENDS_$PN = "gstreamer1.0-plugins-base gstreamer1.0-plugins-good"

do_compile() 
         oe_runmake


do_install() 
         install -d $D$bindir
         install -m 0755 myapp $D$bindir

但不幸的是仍然给出同样的错误......有什么想法可能是错误/遗漏的吗?

提前致谢。

【问题讨论】:

我不确定它会对您有多大帮助,但是 GStreamer 提供了一个模板来开始构建您的应用程序。 gitlab.freedesktop.org/gstreamer/gst-template 请注意,autotools 可能会被 Meson 取代。 谢谢vermaete,我已经有了这个应用程序并且它正在工作我只需要编译并将它添加到petalinux项目中。 嗯,问题的解决方案可能在于 makefile 而不是 bb 配方。无论如何,我认为 GStreamer 离开了 autotools 并搬到了 Meson。大多数 yocto 食谱将为 Meson 构建和维护。 是的,它可能取决于 makefile,但我如何添加路径以编译基本的 gstreamer 应用程序?我什至尝试在配方中直接编译添加以下行(而不是 oe_runmake): $CC $WORKDIR/http-launch.c -o http-launch $CXXFLAGS $LDFLAGS pkg-config --cflags --libs gstreamer1.0 仍然是同样的错误,我真的很迷茫,任何线索/帮助将不胜感激 【参考方案1】:

我认为您缺少指向编译代码所需的 GStreamer 包的 DEPENDS。将它们放在图像中不足以构建此配方。

您可以查看构建 GStreamer 的 RTSP 服务器的配方 (http://cgit.openembedded.org/openembedded-core/tree/meta/recipes-multimedia/gstreamer/gstreamer1.0-rtsp-server_1.16.1.bb?h=master)

DEPENDS = "gstreamer1.0 gstreamer1.0-plugins-base"

【讨论】:

感谢您的回答,我添加了 DEPENDS 行,但不幸的是仍然无法正常工作,我使用新配方编辑我的问题。【参考方案2】:

我终于让它工作了,我所做的是使用makefile来编译,是使用配方,更重要的是添加inherit pkgconfig行,以便在编译期间强制填充sysroot,这是最终的工作配方,希望它可以帮助其他有同样问题的人:

    #
    # This file is the myapp recipe.
    #

    SUMMARY = "Simple myapp application"
    SECTION = "PETALINUX/apps"
    LICENSE = "MIT"
    LIC_FILES_CHKSUM = "file://$COMMON_LICENSE_DIR/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

    SRC_URI = "file://myapp .c \
           file://Makefile \
              "

    S = "$WORKDIR"

    DEPENDS = "glib-2.0 gstreamer1.0"
    RDEPENDS_$PN = "gstreamer1.0-plugins-base gstreamer1.0-plugins-good"

    inherit pkgconfig 

    do_compile() 
             $CC $WORKDIR/myapp.c -o myapp $CFLAGS $LDFLAGS `pkg-config --cflags --libs gstreamer-1.0` 
    

    do_install() 
             install -d $D$bindir
             install -m 0755 myapp $D$bindir
    

【讨论】:

以上是关于在 petalinux 中编译 gstreamer 应用程序时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 petalinux 中检查共享库依赖项

Petalinux 2014.4 使用 board_f 文件构建错误

Gstreamer中GstBuffer 结构体的定义在哪找??

GStreamer在Linux平台的交叉编译

GStreamer在Unbutu和Windows的编译使用细节

gstreamer移植qnx:交叉编译qnx版本的gstreamer插件库