通过github下载源码,自己编译生成的非Xilinx官方动态库,应该如何使petalinux在生成镜像时包含进去呢?
首先按照UG1144中的步骤,建立mylib:

petalinux-create -t apps --template install --name mylib --enable

然后修改<plnx-proj-root>/project-spec/meta-user/recipes-apps/mylib/ mylib.bb文件,本文最终的包含动态库.bb文件如下:

#
# This file is the mylib recipe.
#SUMMARY = "Simple mylib application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"SRC_URI = "file://libopencv_calib3d.so \file://libopencv_calib3d.so.3.4 \file://libopencv_calib3d.so.3.4.10 \file://libopencv_core.so \file://libopencv_core.so.3.4 \file://libopencv_core.so.3.4.10 \file://libopencv_features2d.so \file://libopencv_features2d.so.3.4 \file://libopencv_features2d.so.3.4.10 \file://libopencv_imgcodecs.so \file://libopencv_imgcodecs.so.3.4 \file://libopencv_imgcodecs.so.3.4.10 \file://libopencv_imgproc.so \file://libopencv_imgproc.so.3.4 \file://libopencv_imgproc.so.3.4.10 \file://libopencv_objdetect.so \file://libopencv_objdetect.so.3.4 \file://libopencv_objdetect.so.3.4.10 \file://libopencv_flann.so \file://libopencv_flann.so.3.4 \file://libopencv_flann.so.3.4.10 \file://libQt5Core.so \file://libQt5Core.so.5 \file://libQt5Core.so.5.12 \file://libQt5Core.so.5.12.3 \file://libQt5Network.so \file://libQt5Network.so.5 \file://libQt5Network.so.5.12 \file://libQt5Network.so.5.12.3 \"S = "${WORKDIR}"
TARGET_CC_ARCH += "${LDFLAGS}"do_package_qa[noexec] = "1"
EXCLUDE_FROM_SHLIBS = "1"INSANE_SKIP_${PN} += "ldflags"
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
INHIBIT_PACKAGE_STRIP = "1"do_install() {install -d ${D}${libdir}#install -m 0755 ${S}/mylib ${D}/${bindir}cp ${S}/*.so* ${D}${libdir}install -d ${D}/usr/backup/librarycp ${S}/*.so* ${D}/usr/backup/library
}FILES_${PN} += "${libdir}"
FILES_${PN} += "/usr/backup/library"
FILES_SOLIBSDEV = ""

petalinux实际上是yocto工具套壳,在遇到问题时,除了上Xilinx forum寻找答案,也可以浏览yocto的官网,见参考链接【1】。下述是可能出现的问题:
(1)
由于在.bb文件中创建了动态库备份文件夹,因此编译时会出现如下Multiple shlib providers错误:

一种方法是,根据参考链接【2】,在.bb文件中添加代码:

do_package_qa[noexec] = "1"
EXCLUDE_FROM_SHLIBS = "1"

另一种方法是根据参考链接【3】,将这些动态库设置为PRIVATE_LIBS:

PRIVATE_LIBS += "\动态库文件名 \
"

(2)
出现[installed-vs-shipped]问题,是因为在do_install()中创建了新的备份文件夹,但是FILE_${PN}中没有添加这个文件夹。加上
INSANE_SKIP_${PN} += "installed-vs-shipped"
指令可以忽略该错误,但我们需要的${D}/usr/backup/library不会被创建,也就不能完成备份的功能。
正确的做法是在FILE_${PN}中添加该文件夹:

FILES_${PN} += "/usr/backup/library"

(3)
参考链接【4】yocto官网的3.13.2章节,提到了包含pre-built libraries的.bb文件的写法,因此根据该章节在.bb文件中添加如下语句:

INSANE_SKIP_${PN} += "ldflags"
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
INHIBIT_PACKAGE_STRIP = "1"

包含应用程序的.bb文件如下:

#
# This file is the 804 recipe.
#
SUMMARY = "Simple 804 application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"SRC_URI = "file://image_process \file://radar_process   \file://temp/2647.jpg \file://temp/480.jpg \"
INSANE_SKIP_${PN} += "file-rdeps"
INSANE_SKIP_${PN} += "ldflags"
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
INHIBIT_PACKAGE_STRIP = "1"do_package_qa[noexec] = "1"
EXCLUDE_FROM_SHLIBS = "1"S = "${WORKDIR}"do_install() {install -d ${D}/${bindir}install -d ${D}/${bindir}/configinstall -d ${D}/${bindir}/datainstall -d ${D}/${bindir}/tempinstall -d ${D}/usr/backup/processinstall -d ${D}/usr/backup/process/configinstall -d ${D}/usr/backup/process/datainstall -d ${D}/usr/backup/process/tempinstall -m 0755 ${S}/image_process ${D}/${bindir}install -m 0755 ${S}/radar_process ${D}/${bindir}install -m 0755 ${S}/temp/2647.jpg ${D}/${bindir}/tempinstall -m 0755 ${S}/temp/480.jpg ${D}/${bindir}/tempinstall -m 0755 ${S}/image_process ${D}/usr/backup/processinstall -m 0755 ${S}/radar_process ${D}/usr/backup/processinstall -m 0755 ${S}/temp/2647.jpg ${D}/usr/backup/process/tempinstall -m 0755 ${S}/temp/480.jpg ${D}/usr/backup/process/temp}
FILES_${PN} += "/usr/backup/process"

(1)
由于image_process依赖于opencv库和Qt库,尽管动态库包含进了镜像之中,但是在应用程序的.bb文件中并没有显式地声明依赖库,会造成如下的问题:

一种方法是添加RDEPENDS_${PN},告知yocto应用程序在运行时的依赖库:

RDEPENDS_${PN} += “libopencv-flann libopencv-highgui”

为什么动态库名为libopencv-flann,而不是libopencv_flann?其他的动态库如何写RDEPENDS_${PN}?本文并没有找到详细说明。
因此本文最终选择跳过该项QA检查,方法为在.bb文件中添加如下语句:

INSANE_SKIP_${PN} += “file-rdeps”

参考链接

【1】9 QA Error and Warning Messages — The Yocto Project ® 4.0.999 documentation
【2】https://stackoverflow.com/questions/64317851/yocto-recipe-for-an-application-that-uses-opencv-and-cpp
【3】https://github.com/agherzan/meta-raspberrypi/issues/498
【4】https://docs.yoctoproject.org/dev-manual/common-tasks.html?highlight=inhibit_package_strip

【ZYNQ】petalinux包含自定义的动态库相关推荐

  1. linux gcc 包含头文件 动态库 静态库 链接路径问题

    C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路径. [1 ...

  2. iOS之深入解析如何构建动态库与framework动态更新

    一.动态库的构建步骤 ① 创建动态库 创建一个动态库 MyDynamicFramework: 创建一个测试类: 在 MyDynamicFramework.h(默认生成,可统一暴露头文件) 中 #imp ...

  3. linux下终端urvst,Linux中的静态库与动态库

    #什么是库文件? 库文件是事先编译好的方法的合集.比如:我们提前写好一些数据公式的实现,将其打包成库文件,以后使用只需要库文件就可以,不需要重新编写. #Linux系统中: 1.静态库的扩展名为.a: ...

  4. 编译curl的动态库以及curl动态库的使用

    文章目录 1.编译curl静态库 2.curl动态库的编译 1.直接编译curl源码 2.用户生成自定义curl动态库 2.1.用户根据自己的需要,列出需要使用的接口 2.2 实现上述的接口 2.3 ...

  5. C++ 控制台程序,窗口程序,静态库,动态库的区别

    创建C++程序 控制台程序  创建完成发现编译器给我们生成了一个.cpp文件,并且存在main函数(说明可以运行) 按F5编译链接并运行 出现DOS窗口(但我们说写与窗口相关的代码,说明是操作系统提供 ...

  6. sqlserver如何定义一个静态变量_[Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库...

    1 前言 2 自定义规则实现 2.1 规则功能 2.2 实现规则的理论基础 2.3 规则代码实现 3 总结 4 参考资料 1 前言 为了实现如标题所述的将多个静态库合并为一个动态库,内置的 Bazel ...

  7. MFC的静态库.lib、动态库.dll(包含引入库.lib)以及Unicode库示例

    以vs2012为标准.转自:http://technet.microsoft.com/zh-cn/library/w4zd66ye ,有改动. 一 MFC的静态库(.lib) MFC静态库使用下列命名 ...

  8. linux编译动态库未定义,自定义动态库 对‘*’未定义的引用解决方法

    自定义动态库 对'*'未定义的引用 本帖最后由 longruliang 于 2015-05-25 16:02:26 编辑 自己编写了一个串口方面的动态库,想写一个测试程序,在编译的时候冒出对'*'未定 ...

  9. 包含目录、库目录、附加包含目录、附加库目录、附加依赖项如何使用? 及静态库,动态库的创建与调用和vs里引用的使用

    引言:vs中怎么添加外部头文件? 如过直接在项目头文件处,添加一下,如下图: 否则,依然会报错,如下图: 有两种方法,来解决(你不在vs上的添加它也没事): (1) 直接把外部头文件复制过来,放在此项 ...

  10. Elasticsearch 7.X Ik源码解读,及自定义远程动态词库

    一.ik 远程词库 上篇文章对ik进行了整体的讲解,包括远程动态词库的讲解,但是上篇文章中是基于nginx+静态txt文件实现的,利用nginx 对文件修改后自动添加Last-Modified 的属性 ...

最新文章

  1. 矢量图面层和线层相交得到相交后的线层文件(gis相交)
  2. SHELL中的三神器:管道、重定向、backtick
  3. 英特尔紧急召回SB主板,Intel 6系列芯片组设计缺陷
  4. 用区块链确保用户数据自主权,看DCC如何玩转“普惠金融”?
  5. matlab车辆测距,一种基于单目视觉的车辆测距方法
  6. Apache JMeter 测试webservice接口
  7. linux收发outlook的邮件,Linux邮箱服务器配置:如何让outlook收发邮件,怎么样控制中继...
  8. linux timespec 链接库,Linux内核 timespec_sub()
  9. 基于mycat高可用方案——数据库负载
  10. 刚刚,贝佐斯宣布将辞任亚马逊 CEO 一职!
  11. 任正非:华为鸿蒙将比安卓快 60%;小米回应主题侵权;VS Code 1.36发布​ | 极客头条...
  12. java ajax返回数组_js对ajax返回数组的处理介绍
  13. 马上开始的机器学习顶会ICML该关注什么?论文集、精彩Workshop都在这里
  14. selenium爬取京东笔记本电脑信息
  15. 向量设计丨导师简介丨客户案例丨商业活动丨跨界合作
  16. 越狱完发现bigboss源是空白
  17. Unity3d第一人称视角如何设置
  18. win7 开wifi 关wifi
  19. Zoommy for mac(图片素材搜索下载软件)
  20. vue中当图片地址无效的时候,显示默认图片

热门文章

  1. zmq pub/sub使用详解
  2. 我的理想计算机系100字,我的理想作文100字
  3. tomcat的夏时令问题(时区问题)
  4. 终于有人把元数据讲明白了
  5. Android_Provision
  6. opencv-python学习笔记(十一)—— 图像处理之图像直方图
  7. java注册用户_用java编程实现用户注册并进行登录操作
  8. JavasScript 第二天课 课后笔记 2022.3.26
  9. 推荐阅读20100812
  10. redhat 6.5安装oracle时出现java异常,redhat6.5 下安装 oracle11 报错