4.5 编译运行与测试
源码版本说明
本章基于 ptp-lite v1.0.0 (2026-04-10)。
Makefile
makefile
# ==================== 编译器配置 ====================
# x86编译器(默认)
CC = gcc
# ARM架构编译器
CC_ARM64 = aarch64-linux-gnu-gcc
CC_ARM32 = arm-linux-gnueabihf-gcc
# ==================== 编译选项 ====================
# x86编译选项
CFLAGS = -Wall -Wextra -O2 -std=gnu11
LDFLAGS = -lrt -lm
# ARM64编译选项
CFLAGS_ARM64 = -Wall -Wextra -O2 -std=gnu11
LDFLAGS_ARM64 = -lrt -lm
# ARM32编译选项
CFLAGS_ARM32 = -Wall -Wextra -O2 -std=gnu11
LDFLAGS_ARM32 = -lrt -lm
# ==================== x86编译目标(默认) ====================
all: ptp_master ptp_slave
ptp_master: ptp_master.c ptp_message.c ptp_servo.c
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
ptp_slave: ptp_slave.c ptp_message.c ptp_servo.c
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
# ==================== ARM64编译目标 ====================
arm64: ptp_master_arm64 ptp_slave_arm64
ptp_master_arm64: ptp_master.c ptp_message.c ptp_servo.c
$(CC_ARM64) $(CFLAGS_ARM64) -o $@ $^ $(LDFLAGS_ARM64)
ptp_slave_arm64: ptp_slave.c ptp_message.c ptp_servo.c
$(CC_ARM64) $(CFLAGS_ARM64) -o $@ $^ $(LDFLAGS_ARM64)
# ==================== ARM32编译目标 ====================
arm32: ptp_master_arm32 ptp_slave_arm32
ptp_master_arm32: ptp_master.c ptp_message.c ptp_servo.c
$(CC_ARM32) $(CFLAGS_ARM32) -o $@ $^ $(LDFLAGS_ARM32)
ptp_slave_arm32: ptp_slave.c ptp_message.c ptp_servo.c
$(CC_ARM32) $(CFLAGS_ARM32) -o $@ $^ $(LDFLAGS_ARM32)
# ==================== 清理目标 ====================
clean:
rm -f ptp_master ptp_slave *.o
clean-arm64:
rm -f ptp_master_arm64 ptp_slave_arm64 *.o
clean-arm32:
rm -f ptp_master_arm32 ptp_slave_arm32 *.o
clean-all: clean clean-arm64 clean-arm32
# ==================== 辅助目标 ====================
# 编译所有架构版本
all-arch: all arm64 arm32
# 显示帮助信息
help:
@echo "PTP-lite 编译选项:"
@echo " make - 编译x86版本(默认)"
@echo " make arm64 - 编译ARM64版本"
@echo " make arm32 - 编译ARM32版本"
@echo " make all-arch - 编译所有架构版本"
@echo ""
@echo "清理选项:"
@echo " make clean - 清理x86版本"
@echo " make clean-arm64 - 清理ARM64版本"
@echo " make clean-arm32 - 清理ARM32版本"
@echo " make clean-all - 清理所有版本"
.PHONY: all arm64 arm32 clean clean-arm64 clean-arm32 clean-all all-arch help
编译步骤
x86架构(默认)
bash
make
ARM64架构
bash
make arm64
生成文件:ptp_master_arm64, ptp_slave_arm64
ARM32架构
bash
make arm32
生成文件:ptp_master_arm32, ptp_slave_arm32
编译所有架构
bash
make all-arch
查看帮助
bash
make help
交叉编译工具链安装
Ubuntu/Debian系统:
bash
# 安装ARM64工具链
sudo apt install gcc-aarch64-linux-gnu
# 安装ARM32工具链(硬浮点)
sudo apt install gcc-arm-linux-gnueabihf
Fedora/CentOS系统:
bash
# 安装ARM64工具链
sudo yum install gcc-aarch64-linux-gnu
# 安装ARM32工具链
sudo yum install gcc-arm-linux-gnueabihf
测试步骤
bash
# 步骤1:编译
make
# 步骤2:在机器A运行主时钟
sudo ./ptp_master eth0
# 步骤3:在机器B运行从时钟
sudo ./ptp_slave eth0
# 步骤4:观察同步效果
# 从时钟输出:
# Received Sync seq=0
# Follow_Up seq=0: t1=... t2=...
# Delay_Resp: delay=2000 ns offset=-5000 ns
# CLOCK JUMP: -5000 ns (new time: ...)
# ...
# 步骤5:验证时间
date
# 两台机器的时间应该接近
验证编译结果
bash
# 查看编译后的程序架构信息
file ptp_master # ELF 64-bit x86-64
file ptp_master_arm64 # ELF 64-bit ARM aarch64
file ptp_master_arm32 # ELF 32-bit ARM
清理
bash
# 清理x86版本
make clean
# 清理ARM64版本
make clean-arm64
# 清理ARM32版本
make clean-arm32
# 清理所有版本
make clean-all
📚 本文内容摘自本人的开源书《PTP技术书 - 从思想实验到协议实现》
全书从时间本质的思想实验出发,深度解析 IEEE 1588 协议、逐章分析 LinuxPTP 源码,并带你动手实现一个轻量级 PTP 程序(ptp-lite)。
🔗 在线阅读/下载:ptp-book
bash
git clone https://github.com/Lularible/ptp-book.git
⭐ 如果对您有帮助,欢迎 Star 支持,也欢迎通过 GitHub Issues 交流讨论。