bfin-xxx-gcc中multilib.h的生成

本文详细解析了GCC-4.3.1在Blackfin系列DSP上的多库配置过程,包括Makefile生成方式、变量来源及genmultilib脚本的具体输出。

快乐虾

http://blog.youkuaiyun.com/lights_joy/

lights@hb165.com

   

 

本文适用于

gcc- 4.3.1

Blackfin系列DSP

Visual Studio 2005

   

欢迎转载,但请保留作者信息

 

 

1.1.1.1             Makefile的生成方式

Makefile.in中有这样一段:

# Use the genmultilib shell script to generate the information the gcc

# driver program needs to select the library directory based on the

# switches.

multilib.h: s-mlib; @true

s-mlib: $(srcdir)/genmultilib Makefile

     if test @enable_multilib@ = yes /

        || test -n "$(MULTILIB_OSDIRNAMES)"; then /

       $(SHELL) $(srcdir)/genmultilib /

         "$(MULTILIB_OPTIONS)" /

         "$(MULTILIB_DIRNAMES)" /

         "$(MULTILIB_MATCHES)" /

         "$(MULTILIB_EXCEPTIONS)" /

         "$(MULTILIB_EXTRA_OPTS)" /

         "$(MULTILIB_EXCLUSIONS)" /

         "$(MULTILIB_OSDIRNAMES)" /

         "@enable_multilib@" /

         > tmp-mlib.h; /

     else /

       $(SHELL) $(srcdir)/genmultilib '' '' '' '' '' '' '' no /

         > tmp-mlib.h; /

     fi

     $(SHELL) $(srcdir)/../move-if-change tmp-mlib.h multilib.h

     $(STAMP) s-mlib

也就是说,这个文件是由genmultilib这个脚本文件生成的。

1.1.1.2             变量来源

Makefile.in中涉及到几个变量:

第一个是@enable_multilib@,这个变量将由config.status进行替换。查下替换的内容:

s,@enable_multilib@,$enable_multilib,;t t

即它将用$enable_multilib这个在configure脚本中出现的变量进行替换。而在configure中还有这样一段:

# Determine whether or not multilibs are enabled.

# Check whether --enable-multilib or --disable-multilib was given.

if test "${enable_multilib+set}" = set; then

  enableval="$enable_multilib"

 

else

  enable_multilib=yes

fi;

因而在默认配置下这个变量的取值将为yes

接下来是$ MULTILIB_OPTIONS这几个变量,找一下,可以发现在config/bfin/t-bfin-uclinux这个文件中有它们的定义。

MULTILIB_OPTIONS=mcpu=bf532-none/mcpu=bf532-0.3

MULTILIB_OPTIONS+=mid-shared-library/msep-data mleaf-id-shared-library

MULTILIB_DIRNAMES=bf532-none bf532-0.3 mid-shared-library msep-data mleaf-id-shared-library

MULTILIB_MATCHES=mcpu?bf532-none=mcpu?bf561

MULTILIB_MATCHES+=mcpu?bf532-none=mcpu?bf531-none mcpu?bf532-none=mcpu?bf533-none mcpu?bf532-none=mcpu?bf534-none mcpu?bf532-none=mcpu?bf536-none mcpu?bf532-none=mcpu?bf537-none mcpu?bf532-none=mcpu?bf561-none mcpu?bf532-none=mcpu?bf561-0.5

MULTILIB_MATCHES+=mcpu?bf532-0.3=mcpu?bf531-0.4 mcpu?bf532-0.3=mcpu?bf531-0.3 mcpu?bf532-0.3=mcpu?bf532-0.4 mcpu?bf532-0.3=mcpu?bf533-0.4 mcpu?bf532-0.3=mcpu?bf533-0.3 mcpu?bf532-0.3=mcpu?bf534-0.2 mcpu?bf532-0.3=mcpu?bf534-0.1 mcpu?bf532-0.3=mcpu?bf536-0.2 mcpu?bf532-0.3=mcpu?bf536-0.1 mcpu?bf532-0.3=mcpu?bf537-0.2 mcpu?bf532-0.3=mcpu?bf537-0.1 mcpu?bf532-0.3=mcpu?bf561-0.3 mcpu?bf532-0.3=mcpu?bf561-0.2 mcpu?bf532-0.3=mcpu?bf531-any mcpu?bf532-0.3=mcpu?bf532-any mcpu?bf532-0.3=mcpu?bf533-any mcpu?bf532-0.3=mcpu?bf534-any mcpu?bf532-0.3=mcpu?bf536-any mcpu?bf532-0.3=mcpu?bf537-any mcpu?bf532-0.3=mcpu?bf561-any

MULTILIB_EXCEPTIONS=mleaf-id-shared-library*

MULTILIB_EXCEPTIONS+=mcpu=bf532-0.3/mleaf-id-shared-library*

MULTILIB_EXCEPTIONS+=mcpu=bf532-none/mleaf-id-shared-library*

MULTILIB_EXCEPTIONS+=*msep-data/mleaf-id-shared-library*

那么,t-bfin-uclinux这个文件又用在什么地方呢?在config.gcc中有这样的用法:

bfin*-uclinux*)

     tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h linux.h bfin/uclinux.h"

     tmake_file=bfin/t-bfin-uclinux

     tm_defines="${tm_defines} UCLIBC_DEFAULT=1"

     extra_options="${extra_options} linux.opt"

     use_collect2=no

     ;;

而我们知道config.gcc这个脚本是在configure脚本中调用的,用于与target相关的一些配置。再查找tmake_file,在configure脚本中有这样的语句:

tmake_file_=

for f in ${tmake_file}

do

     if test -f ${srcdir}/config/$f

     then

         tmake_file_="${tmake_file_} /$(srcdir)/config/$f"

     fi

done

tmake_file="${tmake_file_}"

…………..

s,@tmake_file@,$tmake_file,;t t

即它将Makefile.in中的@tmake_file@变量替换为bfin/t-bfin-uclinux

Makefile.in中就有这样的一行:

tmake_file=@tmake_file@

# target overrides

ifneq ($(tmake_file),)

include $(tmake_file)

endif

原来如此。

config.gcc还可以知道,如果我们的目标是生成bfin-elf-gcc,那么它包含的将是config/bfin/t-bfin-elf这个文件。

1.1.1.3             genmultilib脚本

下面再看看genmultilib这个脚本的输出,以bfin-uclinux-gcc的目标为例:

第一个参数是$MULTILIB_OPTIONS,它的值为:

mcpu=bf532-none/mcpu=bf532-0.3 mid-shared-library/msep-data mleaf-id-shared-library

第二个参数$ MULTILIB_DIRNAMES的值为:

bf532-none bf532-0.3 mid-shared-library msep-data mleaf-id-shared-library

第三个参数$ MULTILIB_MATCHES的值为:

mcpu?bf532-none=mcpu?bf561 mcpu?bf532-none=mcpu?bf531-none mcpu?bf532-none=mcpu?bf533-none mcpu?bf532-none=mcpu?bf534-none mcpu?bf532-none=mcpu?bf536-none mcpu?bf532-none=mcpu?bf537-none mcpu?bf532-none=mcpu?bf561-none mcpu?bf532-none=mcpu?bf561-0.5 mcpu?bf532-0.3=mcpu?bf531-0.4 mcpu?bf532-0.3=mcpu?bf531-0.3 mcpu?bf532-0.3=mcpu?bf532-0.4 mcpu?bf532-0.3=mcpu?bf533-0.4 mcpu?bf532-0.3=mcpu?bf533-0.3 mcpu?bf532-0.3=mcpu?bf534-0.2 mcpu?bf532-0.3=mcpu?bf534-0.1 mcpu?bf532-0.3=mcpu?bf536-0.2 mcpu?bf532-0.3=mcpu?bf536-0.1 mcpu?bf532-0.3=mcpu?bf537-0.2 mcpu?bf532-0.3=mcpu?bf537-0.1 mcpu?bf532-0.3=mcpu?bf561-0.3 mcpu?bf532-0.3=mcpu?bf561-0.2 mcpu?bf532-0.3=mcpu?bf531-any mcpu?bf532-0.3=mcpu?bf532-any mcpu?bf532-0.3=mcpu?bf533-any mcpu?bf532-0.3=mcpu?bf534-any mcpu?bf532-0.3=mcpu?bf536-any mcpu?bf532-0.3=mcpu?bf537-any mcpu?bf532-0.3=mcpu?bf561-any

第四个参数$ MULTILIB_EXCEPTIONS的值为:

mleaf-id-shared-library* mcpu=bf532-0.3/mleaf-id-shared-library* mcpu=bf532-none/mleaf-id-shared-library* *msep-data/mleaf-id-shared-library*

第五个参数$MULTILIB_EXTRA_OPTS为空字符串。

第六个参数$ MULTILIB_EXCLUSIONS为空字符串。

第七个参数$ MULTILIB_OSDIRNAMES为空字符串。

第八个参数@enable_multilib@”yes”

最后生成的multilib.h如下:

static const char *const multilib_raw[] = {

". !mcpu=bf532-none !mcpu=bf532-0.3 !mid-shared-library !msep-data !mleaf-id-shared-library;",

"bf532-none mcpu=bf532-none !mcpu=bf532-0.3 !mid-shared-library !msep-data !mleaf-id-shared-library;",

"bf532-0.3 !mcpu=bf532-none mcpu=bf532-0.3 !mid-shared-library !msep-data !mleaf-id-shared-library;",

"mid-shared-library !mcpu=bf532-none !mcpu=bf532-0.3 mid-shared-library !msep-data !mleaf-id-shared-library;",

"msep-data !mcpu=bf532-none !mcpu=bf532-0.3 !mid-shared-library msep-data !mleaf-id-shared-library;",

"mid-shared-library/mleaf-id-shared-library !mcpu=bf532-none !mcpu=bf532-0.3 mid-shared-library !msep-data mleaf-id-shared-library;",

"bf532-none/mid-shared-library mcpu=bf532-none !mcpu=bf532-0.3 mid-shared-library !msep-data !mleaf-id-shared-library;",

"bf532-none/msep-data mcpu=bf532-none !mcpu=bf532-0.3 !mid-shared-library msep-data !mleaf-id-shared-library;",

"bf532-none/mid-shared-library/mleaf-id-shared-library mcpu=bf532-none !mcpu=bf532-0.3 mid-shared-library !msep-data mleaf-id-shared-library;",

"bf532-0.3/mid-shared-library !mcpu=bf532-none mcpu=bf532-0.3 mid-shared-library !msep-data !mleaf-id-shared-library;",

"bf532-0.3/msep-data !mcpu=bf532-none mcpu=bf532-0.3 !mid-shared-library msep-data !mleaf-id-shared-library;",

"bf532-0.3/mid-shared-library/mleaf-id-shared-library !mcpu=bf532-none mcpu=bf532-0.3 mid-shared-library !msep-data mleaf-id-shared-library;",

NULL

};

 

static const char *const multilib_matches_raw[] = {

"mcpu=bf561 mcpu=bf532-none;",

"mcpu=bf531-none mcpu=bf532-none;",

"mcpu=bf533-none mcpu=bf532-none;",

"mcpu=bf534-none mcpu=bf532-none;",

"mcpu=bf536-none mcpu=bf532-none;",

"mcpu=bf537-none mcpu=bf532-none;",

"mcpu=bf561-none mcpu=bf532-none;",

"mcpu=bf561-0.5 mcpu=bf532-none;",

"mcpu=bf531-0.4 mcpu=bf532-0.3;",

"mcpu=bf531-0.3 mcpu=bf532-0.3;",

"mcpu=bf532-0.4 mcpu=bf532-0.3;",

"mcpu=bf533-0.4 mcpu=bf532-0.3;",

"mcpu=bf533-0.3 mcpu=bf532-0.3;",

"mcpu=bf534-0.2 mcpu=bf532-0.3;",

"mcpu=bf534-0.1 mcpu=bf532-0.3;",

"mcpu=bf536-0.2 mcpu=bf532-0.3;",

"mcpu=bf536-0.1 mcpu=bf532-0.3;",

"mcpu=bf537-0.2 mcpu=bf532-0.3;",

"mcpu=bf537-0.1 mcpu=bf532-0.3;",

"mcpu=bf561-0.3 mcpu=bf532-0.3;",

"mcpu=bf561-0.2 mcpu=bf532-0.3;",

"mcpu=bf531-any mcpu=bf532-0.3;",

"mcpu=bf532-any mcpu=bf532-0.3;",

"mcpu=bf533-any mcpu=bf532-0.3;",

"mcpu=bf534-any mcpu=bf532-0.3;",

"mcpu=bf536-any mcpu=bf532-0.3;",

"mcpu=bf537-any mcpu=bf532-0.3;",

"mcpu=bf561-any mcpu=bf532-0.3;",

"mcpu=bf532-none mcpu=bf532-none;",

"mcpu=bf532-0.3 mcpu=bf532-0.3;",

"mid-shared-library mid-shared-library;",

"msep-data msep-data;",

"mleaf-id-shared-library mleaf-id-shared-library;",

NULL

};

 

static const char *multilib_extra = "";

 

static const char *const multilib_exclusions_raw[] = {

NULL

};

 

static const char *multilib_options = "mcpu=bf532-none/mcpu=bf532-0.3 mid-shared-library/msep-data mleaf-id-shared-library";

 

 

参考资料

无心插柳-在vs2005中编译GCC4( 2008-1-13 )

gcc交叉编译的实现( 2008-1-25 )

vs2005下编译gcc:工程文件( 2008-1-30 )

asm_out_filegcc编代码的生成( 2008-1-30 )

gcc4.1中的machine_mode( 2008-2-1 )

gcc 4.3 configure脚本学习(1):前言( 2008-4-23 )

gcc 4.3 configure脚本学习(2):Be Bourne compatible( 2008-4-24 )

gcc 4.3 configure脚本学习(3):NLS nuisances( 2008-4-24 )

bfin-gcc-4.3.1config.h的生成( 2008-8-5 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(1):输出注释( 2008-8-5 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(2):Shell检测( 2008-8-5 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(3):文件配置( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(4):帮助信息输出( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(5):参数判断( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(6):子目录获取( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(7):创建临时目录( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(8):配置文件生成( 2008-8-6 )

bfin-xxx-gcc-4.3.1config.status的生成及运行(9):头文件生成( 2008-8-6 )

 

 

 

 

 

 

 

<think>我们注意到用户在上一次的问题中试图在aarch64架构上安装PX4时删除了g++-multilibgcc-multilib,因为该架构不需要这些包。但是用户现在遇到了卸载这些包时出现的错误:系统提示gcc-multilib未安装,并且无法定位g++-multilib包。 根据引用[1]和引用[2]的内容,这类问题通常是由于软件包依赖关系损坏或软件源配置问题引起的。我们可以采取以下步骤解决: 步骤1:更新软件包列表并修复损坏的依赖关系 步骤2:尝试清除multilib相关的包(如果存在) 步骤3:如果包确实不存在,则跳过并修复可能的残留配置 具体操作如下: 1. 更新软件源并修复损坏的包: ```bash sudo apt update sudo apt --fix-broken install ``` 2. 尝试卸载gcc-multilib和g++-multilib(即使之前提示未安装,也要确保清除): ```bash sudo apt remove gcc-multilib g++-multilib ``` 3. 如果第二步出现无法定位包的错误(如E: Unable to locate package g++-multilib),则可能是因为软件源中没有该包(在aarch64架构上,multilib包可能不可用)。我们可以尝试安装与multilib相关的包,然后再卸载,以确保清除配置。但注意:在aarch64上,multilib包通常不适用,所以我们可以跳过。或者,我们可以尝试安装,但需要确保软件源支持。 4. 如果问题仍然存在,我们可以尝试清除软件包缓存并重新安装软件包管理器: ```bash sudo apt autoclean sudo apt clean sudo apt autoremove sudo dpkg --configure -a ``` 5. 如果上述步骤无效,考虑检查软件源配置。确保/etc/apt/sources.list中的软件源支持aarch64架构,并且包含main和universe仓库。 6. 最后,如果用户确实不需要multilib,可以忽略这些错误,因为它们并不影响aarch64架构下的编译(因为multilib是用于在64位系统上编译32位程序的,而aarch64通常不需要)。 注意:在aarch64上,gcc-multilib和g++-multilib可能根本不存在,所以无法安装也无法卸载是正常的。因此,在PX4的安装脚本中,我们删除了对multilib的依赖(如之前PX4安装步骤中的sed命令)。 总结命令如下: ```bash # 步骤1:更新并修复 sudo apt update sudo apt --fix-broken install -y # 步骤2:尝试卸载multilib包 sudo apt remove gcc-multilib g++-multilib -y # 步骤3:如果出现无法定位包的错误,则执行清理 sudo apt autoclean sudo apt clean sudo apt autoremove -y sudo dpkg --configure -a # 步骤4:检查软件源(可选) # 确保/etc/apt/sources.list中包含类似下面的行(以Ubuntu 20.04为例): # deb http://ports.ubuntu.com/ubuntu-ports focal main universe # 如果不是,请使用sudo编辑该文件,然后运行sudo apt update ``` 完成这些步骤后,用户应该可以继续PX4的安装流程,而不会因为multilib的问题而中断。 注意:在aarch64架构上,我们不需要multilib,所以即使卸载时提示未安装,也不会影响后续的PX4编译。 如果用户仍然遇到问题,可能是由于其他软件包依赖问题,需要根据具体错误信息进一步解决。 §§相关问题§§ 1. 如何检查Ubuntu系统上的软件包依赖关系是否正常? 2. 在Ubuntu上如何修复损坏的软件包? 3. 如何为aarch64架构配置正确的Ubuntu软件源?</think>### 解决卸载 g++-multilibgcc-multilib 的错误 #### 问题分析 错误信息表明系统无法定位或卸载这些包,通常由以下原因引起: 1. 软件包实际未安装 2. 软件源配置问题 3. 包名架构不匹配(尤其aarch64) #### 解决方案 ##### 1. 验证软件包状态 ```bash # 检查包是否真实存在 dpkg -l | grep -E 'gcc-multilib|g++-multilib' # 检查软件源是否包含这些包 apt-cache policy gcc-multilib g++-multilib ``` ##### 2. 修复软件源(关键步骤) ```bash # 更新软件源(添加 universe 仓库) sudo add-apt-repository universe sudo apt update # 修复损坏的依赖关系 sudo apt --fix-broken install ``` ##### 3. 安全卸载流程 ```bash # 尝试完整卸载(即使提示未安装) sudo apt remove --purge gcc-multilib g++-multilib -y # 清除残留配置 sudo apt autoremove --purge -y sudo dpkg --purge $(dpkg -l | grep '^rc' | awk '{print $2}') 2>/dev/null ``` ##### 4. 架构特殊处理(aarch64) ```bash # aarch64 通常不需要 multilib sudo apt-mark hold gcc-multilib g++-multilib # 防止意外安装 # 验证架构兼容性 arch=$(uname -m) echo "当前架构: $arch,multilib 仅适用于 x86_64" ``` #### 典型错误解决 1. **`Package not found` 错误**: ```bash # 添加32位支持(仅x86架构需要) sudo dpkg --add-architecture i386 sudo apt update ``` 2. **依赖冲突**(引用[1][2]问题): ```bash sudo apt install -f # 修复依赖链 sudo aptitude install gcc # 交互式解决冲突 ``` #### 验证结果 ```bash # 确认已卸载 apt list --installed | grep -E 'multilib|gcc-|g\+\+-' # 检查系统健康状态 sudo dpkg --configure -a sudo apt check ``` > **关键提示**:在aarch64架构上(如树莓派、NVIDIA Jetson),`gcc-multilib` 通常不适用且无需安装。若PX4编译需要32位支持,应使用交叉编译工具链[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值