专栏首页hank【分享】MPSoC交叉编译例子

【分享】MPSoC交叉编译例子

1. 介绍

有工程师反馈,使用A53交叉编译器直接编译最简单的C文件,编译器也报告。"stdio.h: No such file or directory"

aarch64-xilinx-linux-gcc -c hello.c -DPLATFORM_ZCU106 -std=c11 -o hello.o
hello.c:3:10: fatal error: stdio.h: No such file or directory
 #include <stdio.h>

2. sysroot

GCC编译代码时,缺省是在目录/usr/include查找头文件,在目录/usr/lib查找库文件。如果是交叉编译,就不能在主机的目录下查找头文件和库文件,因为它们包含的是主机的应用程序的文件。我们需要指定目标单板的头文件和库文件。对于这种需求,GCC使用选项sysroot来实现。

GCC文档关于sysroot的描述如下:

--sysroot=dir
Use dir as the logical root directory for headers and libraries. For example, 
if the compiler normally searches for headers in /usr/include and libraries 
in /usr/lib, it instead searches dir/usr/include and dir/usr/lib.

If you use both this option and the -isysroot option, then the --sysroot option 
applies to libraries, but the -isysroot option applies to header files.

The GNU linker (beginning with version 2.16) has the necessary support for this 
option. If your linker does not support this option, the header file aspect of 
--sysroot still works, but the library aspect does not.

GCC文档关于sysroot的描述

3. 使用sysroot的编译

使用sysroot指定目录后,编译文件成功,没有任何问题。

aarch64-xilinx-linux-gcc --sysroot=/opt/petalinux/2019.2/sysroots/aarch64-xilinx-linux -c hello.c     -DPLATFORM_ZCU106 -std=c11 -o hello.o
aarch64-xilinx-linux-gcc --sysroot=/opt/petalinux/2019.2/sysroots/aarch64-xilinx-linux -o hello hello.o -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed `pkg-config --cflags --libs glib-2.0 gstreamer-1.0 gstreamer-app-1.0` -lpthread -ldl -lrt -Wl,-rpath-link, -Wl,-O1 -Wl,--hash-style=gnu -Wl,--allow-multiple-definition

4. Makefile

在命令行下指定sysroot目录,只能适用于非常简单的代码。对于应用程序的开发,建议使用Makefile。下面提供一个Makefile的例子。

#source "$dir_build/environment-setup-aarch64-xilinx-linux"

PLNX_AARCH_PATH=/opt/petalinux/2019.2/sysroots/aarch64-xilinx-linux

WARNING_CFLAGS =  -Wall 

CC = aarch64-xilinx-linux-gcc --sysroot=$(PLNX_AARCH_PATH)

export PKG_CONFIG_PATH=$(PLNX_AARCH_PATH)/usr/lib/pkgconfig/
LDFLAGS += -lpthread -ldl -lrt -Wl,-rpath-link, -Wl,-O1 -Wl,--hash-style=gnu 

SOURCES = $(wildcard *.c)
OBJECTS = $(patsubst %.c,%.o,$(SOURCES))

CFLAGS = -DPLATFORM_ZCU106 -std=c11

all: hello

hello: hello.o
	$(CC) -o $@ hello.o $(LDFLAGS)

%.o: %.c
	$(CC) -c $< $(CFLAGS) -o $@

clean:
	rm -f $(wildcard *.o) hello

5. 得到sysroot和交叉编译器

在petalinux工程中,执行petalinux-build –sdk,编译完成后能得到sdk.sh安装sdk.sh,后得到文件environment-setup-aarch64-xilinx-linux。执行source environment-setup-aarch64-xilinx-linux,配置好交叉编译器的路径。 在Makefile里,设置sysroot为其中的sysroots/aarch64-xilinx-linux/,GCC就能找到正确的头文件和库文件。

hankf@xszgs4:/opt/petalinux/2019.2$ ls -l
total 28
-rw-r--r-- 1 root root  3502 Jan 17  2020 environment-setup-aarch64-xilinx-linux
-rw-r--r-- 1 root root 13970 Jan 17  2020 site-config-aarch64-xilinx-linux
drwxr-xr-x 4 root root  4096 Oct  5  2019 sysroots
-rw-r--r-- 1 root root    96 Jan 17  2020 version-aarch64-xilinx-linux
hankf@xszgs4:/opt/petalinux/2019.2$ ls -l sysroots/aarch64-xilinx-linux/
total 60
drwxr-xr-x  3 xilinx root 4096 Jan 13  2020 bin
drwxr-xr-x  2 xilinx root 4096 Jan 13  2020 boot
drwxr-xr-x  2 xilinx root 4096 Jan 13  2020 dev
drwxr-xr-x 46 xilinx root 4096 Jan 13  2020 etc
drwxr-xr-x  3 xilinx root 4096 Jan 13  2020 home
drwxr-xr-x  9 xilinx root 4096 Oct  5  2019 lib
drwxr-xr-x  2 xilinx root 4096 Jan 13  2020 media
drwxr-xr-x  2 xilinx root 4096 Jan 13  2020 mnt
dr-xr-xr-x  2 xilinx root 4096 Jan 13  2020 proc
drwxr-xr-x  2 xilinx root 4096 Jan 13  2020 run
drwxr-xr-x  3 xilinx root 4096 Jan 13  2020 sbin
dr-xr-xr-x  2 xilinx root 4096 Jan 13  2020 sys
drwxrwxrwt  2 xilinx root 4096 Jan 13  2020 tmp
drwxr-xr-x 10 xilinx root 4096 Oct  5  2019 usr
drwxr-xr-x  9 xilinx root 4096 Oct  5  2019 var
hankf@xszgs4:/opt/petalinux/2019.2$ source environment-setup-aarch64-xilinx-linux 
hankf@xszgs4:/opt/petalinux/2019.2$ aarch64-xilinx-linux-gcc --version
aarch64-xilinx-linux-gcc (GCC) 8.2.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
hankf@xszgs4:/opt/petalinux/2019.2$ which aarch64-xilinx-linux-gcc
/opt/petalinux/2019.2/sysroots/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-gcc

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 解决错误 undefined reference to symbol '__cxa_throw_bad_array_new_length@@CXXABI_1.3.8'

    在Makefile里,定义CC为"aarch64-linux-gnu-g++ --sysroot=$(MPSOC_ROOTFS)",编译test.cpp,没有错...

    hankfu
  • [分享]升级MPSoC Linux LTS 版本和Realtime版本

    大部分项目设计需要一个稳定的Linux版本,但是又需要修复内核漏洞。这种情况下,跟随LTS版本升级,是最好的办法。 很多项目也需要改善Linux的实时特性。可以...

    hankfu
  • 【分享】MPSoC,XEN虚拟机运行裸核应用程序(baremetal, standalone)的中断延迟

    修改Xilinx的定时器裸核应用程序(baremetal, standalone)例子xttcps_intr_example.c,可以测量中断响应延迟。 然后在...

    hankfu
  • LWC 52:687. Longest Univalue Path

    LWC 52:687. Longest Univalue Path 传送门:687. Longest Univalue Path Problem: Given...

    用户1147447
  • 程序员面试金典 - 面试题 17.12. BiNode(BST中序遍历)

    二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。 实现一个方法,把二叉搜索树转换为单向链表,要求值的顺序保持...

    Michael阿明
  • 图表系列——供需对比的优化

    当供给远远大于需求时会对需求上涨产生压力,而需求远远大于供给时则会对供给形成拉力。所以针对这种报表应通过叠加显示。

    逍遥之
  • 程序员进阶系列:年少不懂爱家家,懂了已是猿中人。

    时隔多年,回想起那个面试场景,忍不住要感叹:年少不懂i++(爱家家),如今懂了却已是老码农(双鬓白)。

    一猿小讲
  • MySQL|优化案例两则

    在数据库表结构变更发布之前,我们会和开发沟通索引设计是否合理,发现部分开发同学对于索引设计还是有一些知识盲区。本文把常见的案例记录下来,做个分析,抛砖引玉。

    用户1278550
  • 技术分享 | 优化案例

    网名“北在南方”,目前任职于杭州有赞科技 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。

    爱可生开源社区
  • 华为2012实验室,用SpreadJS搭建内部管理系统

    近日,葡萄城成功签约深圳华为技术有限公司2012实验室,通过纯前端表格控件SpreadJS 助力华为搭建内部表格数据管理系统,整合企业资源,提高整体办公效率。

    葡萄城控件

扫码关注云+社区

领取腾讯云代金券