poky: qmmp_0.5.2.bb的问题以及修改方法。

本文解决QMMP升级过程中的警告及错误,包括文件未正确打包和非开发包中出现符号链接的问题。通过调整配置和使用do_split_package函数,实现QMMP库文件的有效分离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在升级qmmp的过程中,遇到了下面的错误:

 WARNING: For recipe qmmp, the following files were installed but not shipped in any package:
| WARNING:   /usr/lib/qmmp/FileDialogs/libqmmpfiledialog.so
| WARNING:   /usr/lib/qmmp/FileDialogs/.debug/libqmmpfiledialog.so
| WARNING:   /usr/lib/qmmp/Engines/libmplayer.so
| WARNING:   /usr/lib/qmmp/Engines/.debug/libmplayer.so
| WARNING:   /usr/lib/qmmp/Effect/libstereo.so
| WARNING:   /usr/lib/qmmp/Effect/libladspa.so
....
| ERROR: QA Issue: non -dev/-dbg/-nativesdk package contains symlink .so: qmmp path '/work/i586-poky-linux/qmmp-0.5.1-r0/packages-split/qmmp/usr/lib/libqmmpui.so'
| ERROR: QA Issue: non -dev/-dbg/-nativesdk package contains symlink .so: qmmp path '/work/i586-poky-linux/qmmp-0.5.1-r0/packages-split/qmmp/usr/lib/libqmmp.so'

上面的WARNING错误是说:这些文件已经在image 的里面了,但是打包(打成rpm包的格式),的时候,却没有这些文件。

ERROR:意思是,在非dev,dbg,nativesdk的包的形式中,有了链接。比如:

在qmmp-0.5.2-r0.rpm这就是非qmmp-dev-0.5.2.r0.rpm qmmp-dbg-0.5.2.r0.rpm,qmmp-nativesdk-r0.0.5.2.rpm等等。它是把/usr/bin以及/usr/lib/*的资源打到这个包里面。

在原来的bb文件是这样的。

FILES_${PN} = "${bindir}/qmmp ${libdir}/*.so* \
               ${libdir}/qmmp/PlaylistFormats/*.so \
               ${libdir}/qmmp/Output/libalsa.so \
               ${libdir}/qmmp/Transports/libhttp.so \
               ${libdir}/qmmp/Visual/libanalyzer.so \
               ${datadir}/icons/* \
               ${datadir}/qmmp/images/* \
               ${datadir}/applications/qmmp.desktop \

这个在过来的版本是没有问题的,但是在最新的版本中,不允许这样做了。因为${bindir}和${libdir}是工具本身会去做的。不用在重新做。在do_package_qa中,会有一个函数来判断,是不是在收包的目录里有,链接库*.so,如果有就产生了ERROR,具体为什么这么做,还不知道,以后待研究。

如果想要放置带链接库,那么用lib*${SOLIBS}的形式。

QAPATHTEST[dev-so] = "package_qa_check_dev"
def package_qa_check_dev(path, name, d, elf, messages):
    """
    Check for ".so" library symlinks in non-dev packages
    """

    if not name.endswith("-dev") and not name.endswith("-dbg") and not name.endswith("-nativesdk") and path.endswith(".so") and os.path.islink(path):
        messages.append("non -dev/-dbg/-nativesdk package contains symlink .so: %s path '%s'" % \
                 (name, package_qa_clean_path(path,d)))

所以,正确的写法如下:

FILES_${PN} =+ "\
               ${libdir}/qmmp/*/*.so \
               ${datadir}/icons/* \
               ${datadir}/qmmp/images/* \
               ${datadir}/applications/qmmp.desktop "

如果是,${bindir},${libdir}/* 以外的我们需要手工的加入,比如${libdir}/qmmp/*/*.so,因为,qmmp/*/*.so 不是${libdir}下的资源。

FILES_${PN}-dbg += "\
                ${libdir}/qmmp/*/.debug/* \

               “

还有一个问题就是如何将/usr/lib/qmmp下的库文件,打成每个文件都拥有自己的一个包。

用do_split_packge  函数

用法:

PACKAGES_DYNAMIC += "qmmp-plugin-*"


python populate_packages_prepend () {
        qmmp_libdir = bb.data.expand('${libdir}/qmmp', d)
        do_split_packages(d, qmmp_libdir, '^lib(.*)\.so$', 'qmmp-plugin-%s', 'Qmmp %s Plugin for', recursive=True,extra_depends='')
}

I find .debug can't be packaged to rpm package because it is invisible directory. In current OE-core .debug was shipped to FILES_${PN}-dbg, for example , gtk+ ,qt4-x11-free
If we want to split up .debug/* to single package, we can rename .debug to debug to make this directory visible, then debug directory can be split up to single package.
Please review the following two mode.

Mode 1: Ship  .debug to   FILES_${PN}-dbg

PACKAGES_DYNAMIC = "qmmp-plugin-* "


python populate_packages_prepend () {
        import os
        qmmp_libdir = bb.data.expand('${libdir}/qmmp', d)
        gd = bb.data.expand('${D}/${libdir}/qmmp', d)
        plug_dirs = os.listdir(gd)
# for makeing  do_split_package for each grouping and name them correctly
# qmmp-plugin-<group>-<library>  with the Description: Qmmp <Group> plugin for %s"
# I use the following method.

        for plug_dir in plug_dirs:
                g_plug_dir = os.path.join(qmmp_libdir,plug_dir)
                do_split_packages(d, g_plug_dir, '^lib(.*)\.so$', 'qmmp-plugin-' + plug_dir + '-%s', 'Qmmp' + plug_dir  + 'plugin for %s')



}

# if I don't point files to ship file to ${PN}, then FILE_${PN} will get files in usr/lib/qmmp and qmmp-plug-* will not get files.
FILES_${PN} = "\
                ${bindir}/qmmp \
                ${libdir}/lib*${SOLIBS} \
                ${datadir}/icons/* \
                ${datadir}/qmmp/images/* \
                ${datadir}/applications/* \
                "

FILES_${PN}-dbg += "\
                ${libdir}/qmmp/*/.debug/* \
               "
=================================================================================

Mode 2: Split up  .debug to sub-packages


PACKAGES_DYNAMIC = "qmmp-plugin-* qmmp-debug-plugin-*"


python populate_packages_prepend () {
        import os
        qmmp_libdir = bb.data.expand('${libdir}/qmmp', d)
        qmmp_pkgd = bb.data.expand('${WORKDIR}/package/${libdir}/qmmp', d)
        gd = bb.data.expand('${D}/${libdir}/qmmp', d)
        plug_dirs = os.listdir(gd)

        for plug_dir in plug_dirs:
                #rename .debug to debug
                if os.path.exists( qmmp_pkgd + '/'  + plug_dir + '/.debug'):
                        os.rename(qmmp_pkgd + '/' + plug_dir + '/.debug',qmmp_pkgd + '/' + plug_dir + '/debug')
                g_plug_dir = os.path.join(qmmp_libdir,plug_dir)
                do_split_packages(d, g_plug_dir, '^lib(.*)\.so$', 'qmmp-plugin-' + plug_dir + '-%s', 'Qmmp' + plug_dir  + 'plugin for %s')
                #split up .debug to sub-packages
                g_plug_debug_dir = os.path.join(g_plug_dir,'debug')
                do_split_packages(d, g_plug_debug_dir, '^lib(.*)\.so$', 'qmmp-debug-plugin-' + plug_dir + '-%s', 'Qmmp' + plug_dir  + 'plugin debug for %s')
}

# if I don't point files to ship file to ${PN}, then FILE_${PN} will get files in usr/lib/qmmp and qmmp-plug-* will not get files.
  I check gtk+ and qt4-x11-free and find that they adopt the following method without using default mode.

FILES_${PN} = "\
                ${bindir}/qmmp \
                ${libdir}/lib*${SOLIBS} \
                ${datadir}/icons/* \
                ${datadir}/qmmp/images/* \
                ${datadir}/applications/* \

### 解决 C/C++ 编译错误 'fatal error: led_strip.h: No such file or directory' 当遇到 `fatal error: led_strip.h: No such file or directory` 的编译错误时,这通常意味着编译器无法找到指定的头文件。以下是几种可能的原因以及相应的解决方案: #### 1. 头文件路径未正确设置 如果 `led_strip.h` 文件位于特定目录下,则需要告知编译器该目录的位置。可以通过 `-I` 参数来添加包含路径。 ```bash aarch64-poky-linux-g++ source_file.cpp -o output_program -I/path/to/include/directory ``` 对于 Yocto 构建环境中使用的交叉编译工具链,确保已经执行了环境配置脚本,并且包含了正确的包含路径[^4]。 #### 2. 安装缺失的开发包 有时,所需的头文件属于某个软件包的一部分,在这种情况下应该安装对应的开发版本(通常是带有 `-dev` 或者 `-devel` 后缀)。例如,假设 `led_strip.h` 是由 LED 控制库提供的话,可以尝试通过包管理器安装它。 在基于 Debian/Ubuntu 的系统上: ```bash sudo apt-get install libled-control-dev ``` 如果是其他发行版,请查阅官方文档获取适合的方法。 #### 3. 使用本地副本或将文件放置于标准位置 如果没有现成可用的预构建二进制包,可以从源码下载并自行编译安装;或者直接复制 `led_strip.h` 到项目的根目录或其他已知会被搜索到的地方,比如 `/usr/local/include`. 另外一种做法是在项目内部维护一份拷贝,并调整 Makefile 来指向这个相对路径下的头文件[^3]. #### 4. 修改 IDE 设置 (针对集成开发环境) 如果你正在使用像 Eclipse、CLion 等IDE来进行开发, 需要确认项目属性中的 “Include Paths” 已经被适当地设置了. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值