开发笔记:模块编译 找不到交叉编译器

1.概要

2.内容

1.问题

topeet@ubuntu:~/cq/hl3$ sudo make
[sudo] topeet 的密码: 
make -C /home/topeet/lnx/linux-5.10.198   M=/home/topeet/cq/hl3 modules    #make操作
make[1]: 进入目录“/home/topeet/lnx/linux-5.10.198”
make[1]:aarch64-none-linux-gnu-gcc:命令未找到
  CC [M]  /home/topeet/cq/hl3/helloworld.o
/bin/sh: 1: aarch64-none-linux-gnu-gcc: not found
make[2]: *** [scripts/Makefile.build:286:/home/topeet/cq/hl3/helloworld.o] 错误 127
make[1]: *** [Makefile:1832:/home/topeet/cq/hl3] 错误 2
make[1]: 离开目录“/home/topeet/lnx/linux-5.10.198”
make: *** [Makefile:8:all] 错误 2

解决方法:

这个错误信息表明在尝试编译位于 /home/topeet/cq/hl3 的模块时,系统无法找到名为 aarch64-none-linux-gnu-gcc 的编译器。错误代码 127 通常表示命令不存在。

要解决这个问题,你可以按照以下步骤操作:

  1. 安装交叉编译工具链
    看起来你的项目需要针对 ARM 架构(aarch64)进行编译。你需要安装相应的交叉编译工具链。在 Ubuntu 上,你可以使用以下命令来安装 ARM 64 位的 GCC 交叉编译器:

    sudo apt-get update
    sudo apt-get install gcc-aarch64-linux-gnu

    注意,这里安装的是 gcc-aarch64-linux-gnu,而不是错误中提到的 aarch64-none-linux-gnu-gcc。通常,aarch64-none-linux-gnu-gcc 是指一个更特定的工具链,可能是为裸机或无操作系统环境准备的。确认你的项目文档或 Makefile 中指定的编译器名称是否正确,或者是否需要特定的工具链。

  2. 确认工具链路径
    如果安装了正确的工具链,但系统仍然报错找不到命令,可能是因为工具链没有正确添加到系统的 PATH 环境变量中。你可以通过 echo $PATH 查看当前的 PATH 设置,并确保交叉编译器的路径包含在内。

  3. 修改 Makefile
    如果安装的交叉编译器名称与 Makefile 中使用的不一致,你需要编辑 Makefile,将 aarch64-none-linux-gnu-gcc 替换为正确的编译器名称,比如 aarch64-linux-gnu-gcc

  4. 重新运行 make
    完成上述步骤后,再次运行 sudo make,看看是否能成功编译。

如果你不确定具体需要哪个交叉编译器或者如何配置,建议查阅你的项目文档或者联系项目的维护者获取帮助。

2.ubuntu交叉编译器设置 

在Ubuntu系统中设置交叉编译器通常涉及以下几个步骤,这些步骤将帮助你为特定架构(如ARM、MIPS等)的设备进行交叉编译。以下是一个详细的指南:

一、准备交叉编译工具链

  1. 下载交叉编译工具链

    • 你可以从官方网站或可靠的源下载交叉编译工具链的压缩包。例如,对于ARM架构,你可以从Linaro等网站下载GCC交叉编译器。
  2. 解压工具链

    • 将下载好的交叉编译工具链压缩包解压到Ubuntu系统的某个目录下。例如,你可以将其解压到/usr/local/arm目录下。

二、修改环境变量

为了使系统能够识别并使用交叉编译工具链,你需要修改环境变量。

  1. 临时修改环境变量

    • 你可以在当前终端会话中临时添加交叉编译工具链的路径到PATH环境变量中。例如:
    export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
  2. 永久修改环境变量

    • 为了使每次启动Ubuntu时都能自动导入交叉编译工具链的路径,你可以编辑全局环境变量文件(如/etc/profile/etc/environment)或用户级别的环境变量文件(如~/.bashrc~/.bash_profile)。例如,编辑~/.bashrc文件并添加以下行:
     
      
    export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
    • 保存文件后,执行source ~/.bashrc命令使更改生效。

三、验证交叉编译工具链

  1. 检查交叉编译器版本

    • 在终端中输入交叉编译器的版本号查看命令(如arm-linux-gnueabihf-gcc -v),以验证交叉编译器是否正确安装。
  2. 编译测试程序

    • 编写一个简单的C程序(如hello.c),并使用交叉编译器进行编译。例如:
     
      
    arm-linux-gnueabihf-gcc hello.c -o hello
    • 如果编译成功,将生成一个名为hello的可执行文件,该文件应在目标架构的设备上运行。

四、其他注意事项

  1. 安装依赖库

    • 在某些情况下,交叉编译可能需要额外的依赖库。你可以使用apt-get命令安装这些依赖库。例如:
    sudo apt-get install lsb-core lib32stdc++6
  2. 处理64位与32位兼容性问题

    • 如果在64位Ubuntu系统上运行32位的交叉编译器遇到问题,你可能需要安装32位兼容库。例如:
    sudo apt-get install libc6-i386
  3. 使用虚拟环境

    • 为了简化嵌入式Linux开发中的环境配置和依赖管理流程,你可以考虑使用debootstrap等工具创建虚拟环境,并在其中安装交叉编译工具链和依赖库。

通过以上步骤,你应该能够在Ubuntu系统中成功设置交叉编译器,并为不同架构的目标设备生成可执行文件。

3.问题2

topeet@ubuntu:~/cq/hl3$ sudo make
[sudo] topeet 的密码: 
make -C /home/topeet/lnx/linux-5.10.198   M=/home/topeet/cq/hl3 modules    #make操作
make[1]: 进入目录“/home/topeet/lnx/linux-5.10.198”
make[1]:aarch64-none-linux-gnu-gcc:命令未找到
  CC [M]  /home/topeet/cq/hl3/helloworld.o
/bin/sh: 1: aarch64-none-linux-gnu-gcc: not found
make[2]: *** [scripts/Makefile.build:286:/home/topeet/cq/hl3/helloworld.o] 错误 127
make[1]: *** [Makefile:1832:/home/topeet/cq/hl3] 错误 2
make[1]: 离开目录“/home/topeet/lnx/linux-5.10.198”
make: *** [Makefile:8:all] 错误 2

这个错误表明在尝试编译位于 /home/topeet/cq/hl3 的模块时,系统无法找到名为 aarch64-none-linux-gnu-gcc 的编译器。这个问题通常是因为交叉编译工具链没有正确安装或者其可执行文件的路径没有添加到系统的 PATH 环境变量中。

要解决这个问题,请按照以下步骤操作:

  1. 确认交叉编译工具链是否已安装
    • 检查 /usr/local/ 或其他可能的安装目录下是否有 aarch64-none-linux-gnu-gcc 或者类似名称的编译器。

    • 如果你不确定是否安装了正确的工具链,可以尝试安装 gcc-aarch64-linux-gnu,这是Ubuntu仓库中提供的针对AArch64架构的交叉编译器。使用以下命令安装:

      sudo apt-get update
      sudo apt-get install gcc-aarch64-linux-gnu

      注意,安装的这个编译器名称是 aarch64-linux-gnu-gcc,而不是 aarch64-none-linux-gnu-gcc。如果你的项目特定需要 aarch64-none-linux-gnu-gcc,那么你可能需要从其他源下载并安装这个特定的工具链。

  2. 更新 PATH 环境变量
    • 如果交叉编译工具链已安装但不在 PATH 中,你需要将其添加到 PATH 环境变量中。编辑你的 ~/.bashrc 或 ~/.profile 文件,并添加类似以下的行:

      export PATH=$PATH:/path/to/your/cross-compiler/bin

      替换 /path/to/your/cross-compiler/bin 为你的交叉编译工具链的实际路径。

    • 保存文件后,运行 source ~/.bashrc 或 source ~/.profile 使更改生效。

  3. 修改 Makefile
    • 如果你的项目 Makefile 中硬编码了 aarch64-none-linux-gnu-gcc,并且你安装的是不同的编译器(如 aarch64-linux-gnu-gcc),你需要编辑 Makefile,将所有的 aarch64-none-linux-gnu-gcc 替换为 aarch64-linux-gnu-gcc
  4. 重新运行 make
    • 在做完上述更改后,再次运行 sudo make,看看是否能成功编译。

如果你已经按照这些步骤操作,但仍然遇到问题,可能是因为你的项目有特定的依赖或配置要求。在这种情况下,查阅项目的文档或联系项目的维护者可能是最好的选择。另外,确保你的 Makefile 和项目设置是针对你正在使用的交叉编译工具链进行配置的。

3.1export PATH=$PATH:/usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin 这是我的环境变量设置 

您已经正确地将交叉编译工具链的路径添加到了 PATH 环境变量中。这条命令:

export PATH=$PATH:/usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin

会将 /usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin 目录添加到现有 PATH 变量的末尾。这样,系统就能在该目录下查找并执行交叉编译工具链中的可执行文件了。

请注意,您添加的路径中包含的编译器名称可能是 aarch64-none-linux-gnu-gcc,这是针对裸机或无操作系统环境的 ARM 64 位交叉编译器。确保您的项目或 Makefile 中使用的编译器名称与您安装的工具链中的名称相匹配。

如果您在运行 make 时仍然遇到 “命令未找到” 的错误,请检查以下几点:

  1. 确认编译器存在
    • 使用 ls 命令检查 /usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin 目录下是否确实存在 aarch64-none-linux-gnu-gcc 文件。
  2. 确认环境变量已生效
    • 在运行 make 命令之前,确保您已经执行了 export 命令,并且是在同一个终端会话中。
    • 您可以通过运行 echo $PATH 命令来查看当前的 PATH 设置,并确认您的交叉编译工具链路径是否已包含在内。
  3. 检查 Makefile
    • 确保 Makefile 中使用的编译器命令与您的交叉编译工具链中的编译器名称完全匹配。
  4. 重新加载环境变量
    • 如果您将环境变量添加到了 ~/.bashrc 或 ~/.profile 文件中,请确保您已经运行了 source ~/.bashrc 或 source ~/.profile 命令来重新加载这些设置。
  5. 使用绝对路径
    • 作为临时解决方案,您可以尝试在 Makefile 中直接使用交叉编译器的绝对路径,而不是依赖 PATH 环境变量。

如果您已经检查了所有这些方面但仍然遇到问题,请确保您的交叉编译工具链安装正确无误,并且与您的 Ubuntu 系统和项目要求兼容。如果可能的话,尝试在不同的系统或环境中安装相同的工具链,并看看是否能成功编译您的项目。

 3.2 作为临时解决方案,您可以尝试在 Makefile 中直接使用交叉编译器的绝对路径,而不是依赖 PATH 环境变量。具体怎么设置,我当前是:export CROSS_COMPILE=aarch64-none-linux-gnu-要改成什么,我的交叉编译器的路径是:/usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin有aarch64-none-linux-gnu-gcc

 

在您的 Makefile 中,如果当前是通过 CROSS_COMPILE 变量来设置交叉编译器的前缀,并且您希望直接使用交叉编译器的绝对路径,那么您需要修改 Makefile 中的相关编译命令,让它们直接使用这个绝对路径。

不过,通常更推荐的做法是保持 CROSS_COMPILE 变量的使用,但确保它正确地指向了您的交叉编译工具链。这样,Makefile 中的其他部分就不需要知道具体的编译器路径,只需要使用这个变量即可。

如果您的 Makefile 类似于 Linux 内核的 Makefile,您可能会看到类似这样的设置:

CROSS_COMPILE ?= aarch64-none-linux-gnu-

这行代码的意思是,如果 CROSS_COMPILE 变量没有在环境变量或命令行中定义,那么它就默认使用 aarch64-none-linux-gnu- 作为前缀。实际上,这个前缀后面通常会跟上具体的编译工具名称,比如 gccg++ 等。

为了使用您的交叉编译器的绝对路径,您可以有两种选择:

  1. 修改环境变量
    在运行 make 命令之前,设置 CROSS_COMPILE 环境变量,让它包含交叉编译器的绝对路径(不包括具体的编译工具名称,只包含前缀)。例如:

    export CROSS_COMPILE=/usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
    make

    但是,这种方法可能会让 Makefile 中的其他部分感到困惑,因为它们可能期望 CROSS_COMPILE 只包含前缀,而不是完整的路径。

  2. 修改 Makefile
    直接在 Makefile 中指定交叉编译器的完整路径。这通常不是最佳实践,因为它会使 Makefile 变得不那么可移植。但是,如果这是您需要的临时解决方案,您可以这样做:

    找到 Makefile 中使用 $(CROSS_COMPILE)gcc 或类似的地方,并将它们替换为完整的编译器路径。例如:

    # 假设原来是这样:
    # CC = $(CROSS_COMPILE)gcc
    # 修改为:
    CC = /usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc

    请注意,您可能需要为其他编译工具(如 g++ld 等)做类似的替换。

然而,更常见和推荐的做法是保持 CROSS_COMPILE 变量的使用,并确保它在您的环境中正确设置。如果您想要避免在每次运行 make 时都设置环境变量,您可以在 Makefile 的一个配置文件中(通常是 Makefile 顶部的某个部分或通过 include 指令包含的其他文件)设置这个变量:

CROSS_COMPILE = /usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-

但是,请记得这样做会使您的 Makefile 与特定的交叉编译工具链路径绑定在一起,这可能会降低它的可移植性。通常,最好是通过环境变量或命令行参数来传递这种信息。

 3.3上面:“确认环境变量已生效”,确定没有包括“/usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin”路径,而我在/ect/profile文件中确实设置了“export PATH=$PATH:/usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin”

 

如果您在 /etc/profile 文件中已经设置了 export PATH=$PATH:/usr/local/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin,但是发现该路径并没有生效,那么可能是由以下几个原因导致的:

  1. /etc/profile 未被正确加载
    • /etc/profile 文件是在用户登录时执行的,它设置了全局的环境变量。如果您是通过非登录shell(比如图形界面的终端或者某些类型的远程会话)启动的,那么 /etc/profile 可能不会被执行。
    • 您可以尝试注销并重新登录,或者重启系统,看看环境变量是否生效。
  2. 环境变量被覆盖
    • 在 /etc/profile 之后,可能还有其他脚本或文件(如 ~/.bashrc~/.bash_profile/etc/bash.bashrc 等)修改了 PATH 环境变量。这些后续的修改可能会覆盖 /etc/profile 中的设置。
    • 检查这些文件,看看是否有其他 export PATH=... 命令,并确保它们没有覆盖您想要的路径。
  3. 语法错误
    • 确保 /etc/profile 中的语法是正确的,没有遗漏的引号、括号或其他语法错误。
  4. 权限问题
    • 确保 /etc/profile 文件具有正确的权限,以便所有用户都可以读取它。
  5. shell 类型
    • 不同的 shell(如 bash、zsh、sh 等)可能使用不同的配置文件。如果您使用的是非 bash shell,那么 /etc/profile 可能不会被执行,或者需要另外的配置文件(如 /etc/zsh/zprofile 对于 zsh)。
  6. 验证环境变量
    • 您可以通过运行 echo $PATH 命令来查看当前的 PATH 环境变量设置,并确认您的路径是否包含在内。
    • 另外,您可以使用 type aarch64-none-linux-gnu-gcc 命令来检查交叉编译器是否可以被正确找到。如果返回的是编译器的路径,那么说明环境变量已经设置正确。

如果您确认 /etc/profile 文件被正确加载,并且没有其他脚本覆盖您的设置,但问题仍然存在,那么可能需要更深入地调查您的系统配置和使用的 shell 类型。在某些情况下,可能需要直接在您的 shell 配置文件中(如 ~/.bashrc)设置环境变量,或者使用其他方法来确保它们被正确加载。

4.ubuntu重启命令 

在Ubuntu系统中,有多种方法可以执行重启操作,以下是几种常用的方法:

使用命令行

  1. reboot命令
    • 这是最简单的重启命令。在终端中输入reboot,然后按回车键。系统会要求输入当前用户的密码以确认重启。
  2. shutdown命令
    • sudo shutdown -r now:这条命令会立即重启系统。它会先显示一条关机通知消息,然后立即执行重启操作。
    • sudo shutdown -r +时间:这里的“时间”可以是分钟数或特定的时间点(例如+5表示5分钟后重启,20:35表示在20:35时重启)。
  3. systemctl命令
    • 对于使用systemd作为系统和服务管理器的Ubuntu版本,可以使用sudo systemctl reboot命令来重启系统。这是一种与systemd兼容的重启方式。

使用图形界面

  • 在Ubuntu的图形界面中,可以点击右上角的电源按钮,然后选择“重新启动”选项来重启系统。

使用快捷键

  • Ctrl + Alt + T:按下这个组合键可以打开终端,然后在终端中输入重启命令。
  • Ctrl + Alt + Del:在某些版本的Ubuntu中,按下这个组合键会显示一个菜单,可以选择“重新启动”选项。但请注意,这个快捷键可能在某些配置中被禁用或映射到其他功能。

注意事项

  • 在执行任何重启命令之前,请确保保存您的工作和数据,以免丢失未保存的内容。
  • 如果您是通过远程方式连接到Ubuntu系统,请确保在重启之前已经保存了所有工作并安全地断开了连接。

这些方法提供了灵活性和便利性,您可以根据自己的需求选择最合适的方法来重启Ubuntu系统。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值