3. 使用SDK工具
如果只做 Linux 应用开发,只需要一个 sdk.sh 文件即可,可以脱离 Petalinux 和 Vitis,也可以编译其三方的应用,可以说一劳永逸。
- 配置根文件系统
- petalinux-config -c rootfs
- 编译SDK
- petalinux-build --sdk
- Linux主机或者虚拟机需要连接网络,如果在之前设置离线编译的此时应该打开网络使能,而后可以关闭网络使能
- ![[Pasted image 20241224165450.png]]
- petalinux-package --sysroot
petalinux-package --sysroot
是PetaLinux工具套件中的一个命令,用于生成一个系统根文件系统(sysroot),这个sysroot包含了为目标平台(如Xilinx的Zynq或Zynq UltraScale+ MPSoC等)编译的库、头文件和其他必要的文件
- petalinux-build --sdk
- 安装SDK
- ./project/images/linux/sdk.sh -d path
- 默认在petalinux路径
- ./project/images/linux/sdk.sh -d path
- 使用SDK
- source 设置环境变量
- source …/sdk/environment-setup-aarch64-xilinx-linux
- 查看环境变量
- aarch64
- echo $CC
- echo $CXX
- source 设置环境变量
- 在makefile中使用
- 查询编译器路径(全部参数,尤其是sysroot)
- echo $CC
- echo $CXX
- 修改makefile以下几个方面就可以使用
- CROSS_COMPILE :根据实际开发板进行替换(使用echo $CC可以看到)
- CFLAGS :根据实际开发板进行替换(使用echo $CC可以看到)
- TARGET :替换为你的可执行文件名字
- SRCS :替换为你的源文件
# 定义交叉编译器前缀
CROSS_COMPILE := aarch64-xilinx-linux-
# 定义编译器
CC := $(CROSS_COMPILE)gcc
# 其他编译工具
CXX := $(CROSS_COMPILE)g++
LD := $(CROSS_COMPILE)ld
AR := $(CROSS_COMPILE)ar
# 编译标志
CFLAGS := -march=armv8-a+crc -mtune=cortex-a72.cortex-a53 --sysroot=/media/kemao/linux/pkg_install/sdk/sysroots/aarch64-xilinx-linux -g -Wall -O2
# 目标文件
TARGET := my_program
# 源文件
SRCS := main.c another_file.c
# 生成的目标文件
OBJS := $(SRCS:.c=.o)
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
debug:
$(CROSS_COMPILE)gdb $(TARGET)
# 这里是示例,实际运行需要根据你的目标设备或仿真器来决定
run:
# 你可能需要使用QEMU或将程序传输到目标设备上运行
makefile 解释
CC := $(CROSS_COMPILE)gcc
CXX := $(CROSS_COMPILE)g++
LD := $(CROSS_COMPILE)ld
AR := $(CROSS_COMPILE)ar
- 这些变量使用了
CROSS_COMPILE
前缀,这意味着可以轻松地切换到交叉编译环境。例如,如果CROSS_COMPILE
设置为arm-linux-gnueabihf-
,那么CC
将被解析为arm-linux-gnueabihf-gcc
。
CFLAGS := -march=armv8-a+crc -mtune=cortex-a72.cortex-a53 --sysroot=/media/kemao/linux/pkg_install/sdk/sysroots/aarch64-xilinx-linux -g -Wall -O2
- 这些标志指定了目标架构、优化级别、调试信息等。
-march
和-mtune
选项指定了目标处理器架构和优化设置,
--sysroot
指定了交叉编译的根目录,
-g
用于生成调试信息,
-Wall
启用所有警告,
-O2
用于优化编译。
TARGET := my_program
SRCS := hello.c
# 如果源文件有很多
# 源文件目录
SRC_DIRS := src1 src2 src3
# 查找所有源文件
SRCS := $(wildcard $(addsuffix /*.c, $(SRC_DIRS)))
TARGET
是最终生成的可执行文件的名称,SRCS
是源文件列表。-
SRC_DIRS
变量定义了源文件所在的目录列表。
-
SRCS
变量使用wildcard
函数和addsuffix
函数查找所有源文件
-
# 定义了目标文件的中间对象文件
OBJS := $(SRCS:.c=.o)
- 将源文件的扩展名从
.c
替换为.o
,生成对象文件列表。
# `all`目标是默认目标,它依赖于最终的可执行文件
all: $(TARGET)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
$(TARGET)
依赖于$(OBJS)
,并使用$(CC)
编译器和$(CFLAGS)
编译标志生成可执行文件。$@
表示目标文件(TARGET),$^
表示所有依赖文件(OBJS)。
# 编译每个源文件生成对象文件
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
- 任何
.o
文件依赖于相应的.c
文件,并使用$(CC)
编译器和$(CFLAGS)
编译标志进行编译。-
$(CC)
:这是编译器变量,通常是gcc
或交叉编译器(例如arm-linux-gnueabihf-gcc
)。
$(CFLAGS)
:这是编译标志变量,包含了编译时需要的各种选项(例如优化级别、警告选项、目标架构等)。-c
:这个选项告诉编译器只进行编译,不进行链接。也就是说,只生成目标文件(.o
文件),而不生成可执行文件。$<
:这是自动变量,表示第一个依赖文件。在这个规则中,它表示当前正在编译的源文件(例如hello.c
)。-o $@
:这个选项指定输出文件名,$@
是另一个自动变量,表示目标文件。在这个规则中,它表示生成的对象文件(例如hello.o
)。
-
clean:
rm -f $(OBJS) $(TARGET)
debug:
$(CROSS_COMPILE)gdb $(TARGET)