我的linux之路-1

一位32岁的新手爸爸为了提升技能,从安装VMware和Ubuntu开始,分享了他的嵌入式Linux学习经历,包括安装FTP、NFS及编译内核等过程中遇到的问题与解决方法。

今年32岁多一点,以前接触过linux,但是没有实战经验,停留在写个简单的c函数编译一下这样。

最近当了爸爸,感觉花钱的地方会越来越多,自己的知识体系也要更新了,于是找出了几年前买的forlinx的开发板,尝试着从学习入门,现在就把这段时间的学习经历总结下来,给自己留个学习记录,顺便能帮到别人就更好了。

1 安装vmware station

这个没什么好说的,使用的是ver14 的版本,虚拟机工具什么的都带了,遇到的困难就是我的笔记本是4G的内存,win7系统,感觉跑起来有点卡,尤其是在后面安装了ubuntu之后更是明显。

2 安装ubuntu

怎么说这个过程呢,就是欠抽的过程。开发板带了个9.10 32位的系统,安装后,更新软件失败的太多,于是找了个朋友问下,朋友推荐了14.10的版本,这个好多了,许多软件都可以更新了,于是我开始按照开发板给出的指导手册倒腾着安装vi gcc arm-linux-gcc,在安装nfs系统时,失败了,一直提示缺少安装库。百度后找到了好多源列表开始更新,还是失败了,问朋友,喷狗无解。看到网上说这个版本不是LTS的版本,我想应该是没有提供更新维护,已经不能用了。于是,刚好看到除了最新的18版本,下载镜像,开始倒腾。可是这个beta版本是有问题的,我在使用vm的共享文件时,ubuntu检测不到共享文件夹。于是,下载掉这个版本,这次不敢再瞎折腾了,下载了16.04 LTS的版本,并在这个版本上继续我的学习之路。

总结下:太盲目了,没有了解ubuntu的版本,随意安装,对于初学者来说,花费大量时间倒腾这个东西,还不如老老实实的找个好版本来学习。

3 安装ftp

看到了网上有许多文件共享的方式和工具,但是教程上写的是ftp,那就按照这个来,在16.04LTS上安装ftp还是很顺利的,但是在修改属性文件时就头疼了,按照网上的步骤来,参考教程配置属性文件。还是失败了,主机和板子不能ping通。

百度后得到以下几个问题:

1 win7的防火墙没有关闭

2 ubuntu的上网方式不对

3 虚拟机的配置不对

4 属性文件配置不对

关掉防火墙,将dhcp方式获取网络地址改为手动分配,ubuntu在系统设置中修改网络地址有时是失败的,只好用ifconfig来搞,最后检查虚拟机网络连接方式(桥接)和属性文件(允许读写)

成功了。

4 安装nfs

nfs的目的是能够共享文件系统,按照教程来,基本没有遇到问题,学会了source  exportfs两个命令,最后因为对mount命令的不理解,一直挂载不进去。。。

5 编译内核

这里按照教程来,基本不会出错,但是有个问题必须提出来,并且我也做了详细的记录

root@ubuntu:/forlinx/linux-3.0.1# make zImage
  CHK    include/linux/version.h
  CHK    include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' isup to date.
  CALL   scripts/checksyscalls.sh
  CHK    include/generated/compile.h
  TIMEC  kernel/timeconst.h
Can't use 'defined(@array)' (Maybe you shouldjust omit the defined()?) at kernel/timeconst.pl line 373.
/forlinx/linux-3.0.1/kernel/Makefile:140:recipe for target 'kernel/timeconst.h' failed
make[1]: *** [kernel/timeconst.h] Error 255
Makefile:947: recipe for target 'kernel'failed
make: *** [kernel] Error 2
出现了这些错误,
有人说是交叉编译器的位置错误,所以将Makefile中做了如下修改
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH               := arm
CROSS_COMPILE        :=/usr/local/arm/4.3.2/bin/arm-linux-

#CROSS_COMPILE        ?=$(CONFIG_CROSS_COMPILE:"%"=%)
没有解决问题,直到看到了这个文章

因为perl版本升级,取消了一些语法格式

/timeconst.pl中的373行语句改成这样就可以了

https://www.cnblogs.com/asulove/p/6039907.html

0、开发环境

Ubuntu16.04.164bit

linux-2.6.32.4

 

1、错误描述

使用ubuntu14.0464bit)编译linux2.6.32.4并没有出现什么错误,但是使用ubuntu16.04.164bit)编译linux-2.6.32.4时,却提示Can't use 'defined(@array)' (Maybe youshould just omit the defined()?)错误。

 

2、解决方法

参考:编译kernel perl版本bug

最近升级了一下MAC系统,突然发现androidLinux kernel无法编译通过了,报了如下错误:

Can't use 'defined(@array)' (Maybe youshould just omit the defined()?) at kernel/timeconst.pl line 373.

其实,提示的错误信息已经明确告诉你了,你应该省略defined().

这里,我们打开 kernel/timeconst.pl

@val = @{$canned_values{$hz}};

if (defined(@val)) {

@val = compute_values($hz);

}

output($hz, @val);

if (defined(@val)) 改为if (@val),再次编译就可以通过了。

查了一下更新,发现其中有一项是perl版本升级到了 v5.22.1,然后查了perl官方文档,发现官网因为一个bug,该版本将defined(@array)去掉了。可以直接使用数组判断非空。

 问题解决了。下面我会继续学习其他的东西。

本人目前是做arm的嵌入式软件开发,所以想在嵌入式linux方向上发展,学习方法还不太明确,欢迎大家提出建议和意见。

非常棒的发现! 你刚刚提供了一个关键信息: ```bash ls ~/SDK98632/nvt98632/toolchain/bin/ ``` 输出全是: ``` arm-ca53-linux-gnueabihf-xxxx ``` ✅ 这说明: > **你的 SDK 实际使用的是 `arm-ca53-linux-gnueabihf` 工具链,用于 ARM Cortex-A53 架构,硬浮点(gnueabihf),32 位 ARM(ARMv7-A 或兼容 AArch32)** --- ## 🧠 所以你现在面临的核心矛盾是: | 事实 | 情况 | |------|------| | ✅ 工具链存在 | 是 `arm-ca53-linux-gnueabihf-gcc`,完整可用 | | ❌ 构建系统试图调用 | `arm-openwrt-linux-uclibcgnueabi-gcc`(错误前缀 + 错误运行库) | | 🔁 原因 | OpenWrt 风格构建系统没有正确配置为使用你这个自定义工具链 | --- ## ✅ 目标:让构建系统使用正确的编译器 我们要做到以下几点: 1. ✅ 让 Makefile 使用 `CC=arm-ca53-linux-gnueabihf-gcc` 2. ✅ 确保 `PATH` 包含该工具链路径 3. ✅ 修改架构设置为 `arm`(不是 `aarch64`),但启用 `gnueabihf` 和 `hard-float` 4. ✅ 禁用 uClibc 相关逻辑(如果不需要) --- ## ✅ 解决方案步骤 ### ✅ 步骤一:将 toolchain 加入环境变量 PATH ```bash export PATH=/home/user/SDK98632/nvt98632/toolchain/bin:$PATH ``` 验证是否生效: ```bash arm-ca53-linux-gnueabihf-gcc --version ``` 你应该看到类似输出: ```text arm-ca53-linux-gnueabihf-gcc (GCC) 10.4.0 Copyright (C) 2020 Free Software Foundation, Inc. ``` 📌 成功!现在系统可以找到你的交叉编译器。 --- ### ✅ 步骤二:修改目标平台架构配置(告诉 OpenWrt 使用 `arm` + `gnueabihf`) 进入目标目录: ```bash cd ~/SDK98632/platform ``` 编辑主 Makefile(通常是子系统的定义文件): ```bash vim target/linux/mstar/Makefile ``` 确保有如下内容: ```makefile # 支持硬浮点 ARMv7-A Cortex-A53 ARCH:=arm CPU_TYPE:=cortex-a53 FEATURES+=fpu LINUX_VERSION:=5.10.168 # 可选:指定 ABI 为 hard-float ARM_ABI:=gnueabihf ``` > ⚠️ 注意:虽然叫 `arm`,但它支持的是 **32 位 ARM 硬浮点模式**,即 `arm-linux-gnueabihf` 类型。 --- ### ✅ 步骤三:修改内核编译时的 `CC` 和 `CROSS_COMPILE` 在你原来的报错中: ```bash make -C ... CC="arm-openwrt-linux-uclibcgnueabi-gcc" ... ``` 这是不对的。我们需要让它变成: ```bash CC="arm-ca53-linux-gnueabihf-gcc" CROSS_COMPILE="arm-ca53-linux-gnueabihf-" ``` #### 方法一:通过 `.config` 控制 运行: ```bash make menuconfig ``` 选择正确的 Target System → Subtarget → Profile 然后退出保存。 检查 `.config` 文件: ```bash grep -i cross_compile .config grep -i cc .config ``` 如果没有自动设置,手动添加或修改: ```ini CONFIG_CROSS_COMPILE="arm-ca53-linux-gnueabihf-" CONFIG_TARGET_ARCH="arm" CONFIG_ARM_EABIHF=y ``` 或者更直接地,在顶层 Makefile 中强制覆盖: ```makefile # 在 platform/Makefile 或命令行中 export CROSS_COMPILE := arm-ca53-linux-gnueabihf- export CC := $(CROSS_COMPILE)gcc export CXX := $(CROSS_COMPILE)g++ ``` --- ### ✅ 步骤四:清理并重新开始构建 ```bash make distclean make defconfig make prereq make target/linux/clean make target/linux/compile V=s ``` 此时你应该看到日志变为: ```text make -C /home/user/SDK98632/platform/build_dir/linux-mstar/linux-5.10.168 \ CROSS_COMPILE="arm-ca53-linux-gnueabihf-" \ CC="arm-ca53-linux-gnueabihf-gcc" \ ARCH="arm" \ ... ``` 并且不再报错 `command not found`! --- ### ✅ 步骤五:确认编译成功启动 正常输出应包含: ```text HOSTCC scripts/basic/fixdep GEN ./Makefile CC kernel/bounds.s GEN arch/arm/include/generated/asm/bounds.h CC arch/arm/kernel/asm-offsets.s GEN include/generated/asm-offsets.h CALL scripts/atomic/check-atomics.sh CHK include/generated/version.h UPD include/generated/version.h CC init/main.o ``` 👉 出现 `arch/arm/` 表示架构正确 👉 没有 `uClibc` 报错表示运行库匹配 --- ## 💡 小贴士:关于 `arm` vs `aarch64` | 类型 | 描述 | |------|------| | `arm` + `gnueabihf` | 32 位 ARM,支持硬件浮点运算(如 Cortex-A53 运行在 AArch32 模式) | | `aarch64` + `linux-gnu` | 64 位 ARM(AArch64 模式),需要 `aarch64-linux-gnu-gcc` | 🎯 MStar MSO98632 芯片虽然是 Cortex-A53 核心,但很多 NVR 方案为了节省内存和兼容旧驱动,仍然运行在 **32 位模式(ARMv7-A)** 下,使用 `gnueabihf` ABI。 所以你现在的工具链 `arm-ca53-linux-gnueabihf-*` 是完全合理的! --- ## ✅ 总结 | 问题 | 解法 | |------|------| | ❌ `arm-openwrt-linux-uclibcgnueabi-gcc not found` | 不是你该用的编译器 | | ✅ 你真正要用的编译器 | `arm-ca53-linux-gnueabihf-gcc` | | 🔧 如何修复? | 1. 添加到 `PATH`<br>2. 设置 `CROSS_COMPILE=arm-ca53-linux-gnueabihf-`<br>3. 修改 `target/linux/mstar/Makefile` 设置 `ARCH:=arm` + `ARM_ABI:=gnueabihf`<br>4. 清理重建 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值