作者:Ibaie,AMD开发工程师
以下博文演示了在Vitis™ 中对 Linux 应用程序开发的过程中如何使用外部库。
我将使用由 libxml2 库所提供的“Parse and validate an XML file with an xmlReader” 应用示例来演示本示例,并且和基于 ZCU102 开发板的 PetaLinux BSP 编译出来的 Linux 镜像相关联。
创建 Linux 域
要在 Vitis 中开发嵌入式 Linux 应用,需要在工作空间内创建含 Linux 域的平台工程。
此平台工程是根据所选的硬件规格文件 (XSA) 创建的,该文件可以是在 Vivado 中生成的定制 XSA,也可以是 Vitis 内的预定义 XSA 文件。
由于本示例是使用 PetaLinux BSP 构建的,因此用于创建平台的 XSA 文件与用于 PetaLinux 工程的 XSA 文件相同。
此外,目标的启动组件通常在 PetaLinux中生成(或者也可以使用pre-built中的组件),因此无需选中“Generate boot components”(生成启动组件)选项。
生成的硬件平台工程提供了基本 Linux 域,其中所有可选设置均未定义。
此工程足以用于开发简单的应用,例如,hello world。
以该域为目标的应用将搭配 Vitis IDE 使用预定义的工具链和 sysroot。
编译好的应用程序可能可以在 Linux 镜像上正常运行,不出现任何问题,但还请谨记,也可能因为主机上安装的库/头文件与Linux镜像上的不一致而导致出错。
预安装的系统仅提供一些基本库,因此在编译我们这个示例的时候,因为缺少这些头文件和库,很可能无法编译成功。
构建 Linux 库
PetaLinux 提供了根文件系统配置菜单,用于构建库并将其添加到生成的 Linux 镜像或分发版中。如《PetaLinux 工具文档:参考指南》(UG1144) 中所述,此配置为静态菜单,其中提供了赛灵思支持的实用工具和库。
此外,库不支持的配方可从现有/已使用的层次或者从其它层次添加到镜像中。如需获取进一步的指导信息,请参阅 (UG1144) 中的将现有配方添加到根文件系统中部分。
对于此示例,在镜像中添加了包含开发包和调试包在内的 libxml2 库。
使用 petalinux-build 命令把库都编译一下。
生成目标 sysroot
如 (UG1144) 的 SDK 生成部分中所述,PetaLinux 提供了 SDK 生成功能,用于构建和部署交叉编译工具链和目标 sysroot 以供应用开发之用。
在默认目录内封装好 sysroot 后,即可在生成的 SDK 文件夹内找到 libxml2 的库和头文件。
配置 Linux 域
Vitis 中的 Linux 域配置菜单提供了设置可选 sysroot 目录的选项。完成配置和构建后,sysroot 将复制到平台的导出目录中,以便后续供以 Linux 域为目标的任何应用使用。
此外,创建的应用将自动使用导出的 sysroot 目录。
创建 Linux 应用
使用定制 sysroot 配置完 Linux 域,并在 Vitis 中以该 Linux 域为目标创建 Linux 应用工程之后,该应用将自动配置为使用先前导出的 sysroot 路径。
以上配置设置将自动填充应用工程的 C/C++ 设置,用来设置编译器的“Include Paths (-I)”(包含路径)选项和 sysroot (--sysroot) 选项以及连接器的库搜索路径 (-L)。由该工具配置的编译器和连接器设置均可在软件平台配置的选项中找到。
有些库文件,例如:libxml2 ,或是include 目录中需要包含的额外的分层文件夹等,要配置额外的搜索路径来查找这些头文件。在此示例中,需将
最后,在工程配置选项中,需通过库选项 (-l) 选中将在应用中使用的所有库。
现在 Linux 应用工程已正确配置了所需要的第三方库,因此可成功构建该工程。
结论
Vitis IDE 支持以开箱即用方式进行 Linux 应用开发,在此过程中,它会使用预安装的工具链和库以及为您的目标平台而创建的默认 Linux 域。
此外,该域可配置为利用可选 sysroot 文件夹来使用第三方库。该选项能够与 PetaLinux 的 SDK 生成功能完美搭配,以便将该域配置为使用专为 Linux 镜像构建的库,并将这些库部署在目标平台上。