OpenWrt SDK 开发实战:从编译到应用部署
1. OpenWrt SDK开发环境搭建第一次接触OpenWrt SDK时我也被各种编译选项和依赖关系搞得晕头转向。经过多次实践我总结出一套最稳定的环境配置方案。首先需要准备一台性能足够的Linux主机我推荐使用Ubuntu 20.04 LTS版本这个系统对开发工具链的支持最完善。安装基础依赖包是关键的第一步很多新手都会在这里踩坑。执行以下命令安装必备工具sudo apt update sudo apt install build-essential ccache ecj fastjar file g gawk \ gettext git java-propose-classpath libelf-dev libncurses5-dev \ libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \ python3-distutils python3-setuptools rsync subversion swig time \ xsltproc zlib1g-dev这里有个小技巧建议使用ccache来加速后续的编译过程。在~/.bashrc中添加export CCACHE_DIR/path/to/ccache和export PATH/usr/lib/ccache:$PATH可以节省30%以上的编译时间。我曾经在一个项目中反复编译ccache帮我节省了至少5个小时的等待时间。2. 获取和编译OpenWrt SDK获取SDK有两种方式直接从官网下载预编译版本或者从源码自行编译。对于新手来说我建议先尝试官方预编译版本熟悉流程后再考虑自行编译。官方SDK下载地址可以在OpenWrt的下载页面找到选择与目标设备匹配的版本。如果要自行编译SDK操作步骤如下git clone https://git.openwrt.org/openwrt/openwrt.git cd openwrt ./scripts/feeds update -a ./scripts/feeds install -a make menuconfig在menuconfig界面中需要特别注意几个关键选项在Global build settings中启用Build the OpenWrt SDK根据目标设备选择正确的Target System和Subtarget选择必要的软件包但不要贪多否则会显著增加编译时间编译完成后SDK文件会生成在bin/targets目录下文件名格式为openwrt-sdk-架构-工具链版本.tar.xz。我建议将这个文件备份因为重新编译一次可能需要数小时。3. SDK解压与基础配置拿到SDK压缩包后不要直接在原目录解压。我习惯在~/openwrt_sdk目录下操作mkdir ~/openwrt_sdk cp openwrt-sdk-sunxi-cortexa7_gcc-10.2.0_musl_eabi.Linux-x86_64.tar.xz ~/openwrt_sdk cd ~/openwrt_sdk tar xf openwrt-sdk-sunxi-cortexa7_gcc-10.2.0_musl_eabi.Linux-x86_64.tar.xz解压后的目录结构非常重要需要理解每个子目录的作用dl/存放下载的源码包缓存feeds/软件源定义staging_dir/工具链和开发环境package/自定义软件包的存放位置首次使用SDK时建议先更新软件源./scripts/feeds update -a ./scripts/feeds install -a这里有个常见问题如果遇到软件包下载失败可以手动将dl/目录从完整OpenWrt源码复制过来能节省大量下载时间。4. 开发自定义软件包在SDK中开发软件包是最常见的需求。我以开发一个简单的helloworld程序为例说明完整流程。首先创建package/helloworld目录里面需要包含几个关键文件helloworld/ ├── Makefile └── src/ ├── helloworld.c └── Makefile顶层Makefile的内容示例include $(TOPDIR)/rules.mk PKG_NAME:helloworld PKG_RELEASE:1 PKG_BUILD_DIR:$(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk define Package/helloworld SECTION:utils CATEGORY:Utilities TITLE:Hello World Program endef define Package/helloworld/description A simple hello world program demonstration. endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) \ CC$(TARGET_CC) \ CFLAGS$(TARGET_CFLAGS) \ LDFLAGS$(TARGET_LDFLAGS) endef define Package/helloworld/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/helloworld $(1)/usr/bin/ endef $(eval $(call BuildPackage,helloworld))src/helloworld.c就是普通的C程序src/Makefile需要针对交叉编译做特殊配置helloworld: helloworld.o $(CC) $(LDFLAGS) helloworld.o -o helloworld helloworld.o: helloworld.c $(CC) $(CFLAGS) -c helloworld.c clean: rm -f *.o helloworld开发完成后执行编译命令make package/helloworld/compile如果编译成功生成的ipk包会放在bin/packages目录下。我建议在虚拟机中先测试ipk包是否能够正常安装运行再部署到实际设备。5. 内核模块开发实战开发内核模块比用户态程序复杂一些需要特别注意内核版本兼容性。以开发一个简单的字符设备驱动为例创建package/kernel/kmod-hello目录结构如下kmod-hello/ ├── Makefile └── src/ ├── hello.c └── Makefile顶层Makefile示例include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:kmod-hello PKG_RELEASE:1 include $(INCLUDE_DIR)/package.mk define KernelPackage/hello SUBMENU:Other modules TITLE:Simple Hello World driver FILES:$(PKG_BUILD_DIR)/hello.ko AUTOLOAD:$(call AutoLoad,30,hello) endef define KernelPackage/hello/description This is a simple hello world kernel module. endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef define Build/Compile $(MAKE) -C $(LINUX_DIR) \ ARCH$(LINUX_KARCH) \ CROSS_COMPILE$(TARGET_CROSS) \ M$(PKG_BUILD_DIR) \ modules endef $(eval $(call KernelPackage,hello))src/hello.c是标准的内核模块代码src/Makefile需要特殊配置obj-m : hello.o编译内核模块的命令与普通软件包类似make package/kernel/kmod-hello/compile在实际项目中我遇到过模块加载失败的问题后来发现是内核配置缺少必要的选项。建议在menuconfig中确认以下选项已启用CONFIG_MODULESyCONFIG_MODULE_UNLOADyCONFIG_KMODy6. 高级技巧与问题排查经过多个项目的积累我总结出几个提高开发效率的技巧。首先是利用ccache加速编译在SDK目录下创建files/ccache.conf文件内容为max_size 5G sloppiness file_macro,locale,time_macros然后在make命令前加上CCACHE_DIR和PATH环境变量CCACHE_DIR/path/to/ccache PATH/usr/lib/ccache:$PATH make package/helloworld/compile另一个常见问题是依赖关系处理。我建议在开发初期就使用以下命令检查依赖make package/helloworld/check-depends make package/helloworld/depends如果遇到编译错误可以尝试以下排查步骤查看build_dir/target-/helloworld-/config.log检查是否所有依赖包都已正确安装确认交叉编译工具链路径设置正确尝试make package/helloworld/clean后重新编译最后分享一个实用技巧在开发过程中可以使用以下命令只下载源码而不编译make package/helloworld/download这对于网络环境不稳定的开发者特别有用可以先把所有源码下载好再断网编译。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2431868.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!