美杜莎编译安装报错:checking build system type... Invalid configuration `x86_64-unknown-linux-‘: machine `x86_

本文介绍了一种常见的编译错误及其解决方法。通过使用 yum 安装 gcc 和 gcc-c++,可以有效解决编译过程中遇到的问题。

场景再现

(编译的时候出现以下的错误) 

解决方案如下

(成功安装)

[root@bogon medusa-2.2]# yum -y install gcc gcc-c++
已加载插件:fastestmirror

<think>根据错误信息,问题在于 `config.sub` 脚本无法识别 `aarch64-openwrt-linux-musl` 这个配置字符串。这通常是因为 `config.sub``config.guess` 文件过旧,无法识别新的系统类型。解决方法就是更新这两个文件到最新版本。 ### 解决方案步骤: 1. **下载最新版本的 `config.sub``config.guess`**: 这些文件通常可以在 GNU 的 config 仓库中找到。 2. **替换项目中的旧文件**: 将下载的最新文件覆盖项目中的旧文件。 3. **重新运行 `./configure`**。 ### 具体操作: #### 1. 进入项目根目录: ```bash cd libxml2-2.10.3 ``` #### 2. 备份旧的配置文件(可选): ```bash mv config.sub config.sub.old mv config.guess config.guess.old ``` #### 3. 下载最新的配置文件: ```bash wget -O config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess' wget -O config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub' ``` #### 4. 赋予执行权限: ```bash chmod +x config.sub config.guess ``` #### 5. 重新运行配置命令: 使用之前相同的配置命令重新运行。 ### 完整脚本示例: ```bash #!/bin/bash # 设置环境变量 export OPENWRT_SDK="/path/to/openwrt-sdk" export TOOLCHAIN="$OPENWRT_SDK/toolchain-aarch64_cortex-a53_gcc-8.4.0_musl" export STAGING_DIR="$TOOLCHAIN" export PATH="$TOOLCHAIN/bin:$PATH" export TARGET_HOST="aarch64-openwrt-linux-musl" # 进入源码目录(假设已经下载并解压) cd libxml2-2.10.3 # 更新 config.guess 和 config.sub wget -O config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess' wget -O config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub' chmod +x config.guess config.sub # 配置 ./configure \ --host="$TARGET_HOST" \ --prefix="$(pwd)/install" \ --without-python \ --without-http \ --without-ftp \ --enable-shared \ --disable-static \ --with-sysroot="$TOOLCHAIN" \ CC="${TARGET_HOST}-gcc" \ CXX="${TARGET_HOST}-g++" \ AR="${TARGET_HOST}-ar" \ RANLIB="${TARGET_HOST}-ranlib" \ STRIP="${TARGET_HOST}-strip" \ CFLAGS="-Os -fPIC -I$TOOLCHAIN/include" \ LDFLAGS="-L$TOOLCHAIN/lib -Wl,-rpath-link,$TOOLCHAIN/lib" # 编译安装 make -j$(nproc) make install ``` ### 如果问题仍然存在: 如果更新了配置文件后仍然报相同的错误,可能是因为下载的配置文件仍然不包含对`aarch64-openwrt-linux-musl`的支持。这时,我们可以尝试手动添加支持。 #### 手动修改 `config.sub` 文件: 在 `config.sub` 文件中找到识别机器类型的地方,添加对`aarch64-openwrt-linux`的支持。 1. 打开 `config.sub` 文件: ```bash vim config.sub ``` 2. 查找 `case $basic_machine in` 部分,在适当的位置添加以下行(通常在 `aarch64` 相关条目的附近): ```bash aarch64-openwrt-linux) basic_machine=aarch64-openwrt-linux os=-linux-gnu ;; ``` 但实际上,我们可能希望更通用一些,比如匹配 `aarch64-openwrt-*`。我们可以这样添加: ```bash aarch64-openwrt-*) basic_machine=aarch64-openwrt os=$(echo $basic_machine | sed 's/^aarch64-openwrt-//') ;; ``` 或者更简单的方式,在 `case $basic_machine in` 部分添加: ```bash aarch64-openwrt*) basic_machine=aarch64-openwrt os=linux-musl ;; ``` 但修改 `config.sub` 需要一定的经验。如果上述方法不可行,建议尝试使用更通用的目标标识符。 ### 替代方案:使用通用目标标识符 有时,我们可以使用更通用的目标标识符,比如 `aarch64-linux-gnu`,然后通过显式指定编译器来覆盖。 ```bash export TARGET_HOST="aarch64-linux-gnu" ./configure \ --host="$TARGET_HOST" \ ... # 其他参数保持不变 CC="aarch64-openwrt-linux-musl-gcc" \ ... # 其他工具链也显式指定 ``` 这样,配置系统会使用 `aarch64-linux-gnu` 作为目标,但实际使用的编译器是我们指定的 OpenWrt 工具链。 ### 验证配置文件是否支持目标字符串: 在更新或修改配置文件后,我们可以运行以下命令来检查目标字符串是否被识别: ```bash ./config.sub aarch64-openwrt-linux-musl ``` 如果输出是 `aarch64-openwrt-linux-musl` 或者被正确解析为目标机器和系统,说明配置成功。 ### 错误处理: 如果遇到其他错误,比如 `C compiler cannot create executables`,请检查工具链路径是否正确,以及是否安装了必要的库。 ### 总结: 1. 更新 `config.sub``config.guess` 是最常见的解决方案。 2. 如果更新后仍不支持,可以手动修改 `config.sub` 添加对目标字符串的支持。 3. 使用通用目标标识符并显式指定工具链也是一种有效的替代方法。 §§相关问题§§: 1. 如何为其他非标准交叉编译工具链(如 mipsel-buildroot-linux-uclibc)解决类似的配置识别问题? 2. 在交叉编译过程中如何正确处理 libxml2 的可选依赖(如 zlib 和 iconv)? 3. 如何将交叉编译的 libxml2 集成到 OpenWrt 的固件构建系统中? 4. 当遇到 "C compiler cannot create executables" 错误时,应该如何诊断和解决?</think># 解决 "Invalid configuration 'aarch64-openwrt-linux-musl'" 错误 当交叉编译 libxml2 时遇到 `checking host system type... Invalid configuration 'aarch64-openwrt-linux-musl': machine 'aarch64-openwrt-linux' not recognized` 错误,这通常是由于 autoconf 配置文件无法识别 OpenWrt 特定的目标平台名称。以下是完整的解决方案: ## 完整解决方案 ### 1. 更新配置文件并手动添加支持 ```bash #!/bin/bash # fix_openwrt_configuration.sh # 设置环境变量 export OPENWRT_SDK="/path/to/openwrt-sdk" export TOOLCHAIN="$OPENWRT_SDK/toolchain-aarch64_cortex-a53_gcc-8.4.0_musl" export STAGING_DIR="$TOOLCHAIN" export PATH="$TOOLCHAIN/bin:$PATH" export TARGET_HOST="aarch64-openwrt-linux-musl" # 进入源码目录 cd libxml2-2.10.3 # 步骤1: 更新配置文件 wget -O config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess' wget -O config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub' chmod +x config.guess config.sub # 步骤2: 手动添加 OpenWrt 支持 # 在 config.sub 中添加 OpenWrt 识别规则 sed -i '/-linux-\*)/i \ aarch64-openwrt-* | \\ ' config.sub sed -i '/^case $basic_machine in/a \ \taarch64-openwrt-* \\\ \t\tbasic_machine=aarch64-openwrt \ \t\tos=linux-musl \ \t\t;;' config.sub # 步骤3: 验证配置 echo "验证配置支持:" ./config.sub $TARGET_HOST # 步骤4: 配置编译参数 ./configure \ --host=$TARGET_HOST \ --prefix=$(pwd)/install \ --without-python \ --without-http \ --without-ftp \ --enable-shared \ --disable-static \ --with-sysroot=$TOOLCHAIN \ CC="${TARGET_HOST}-gcc" \ CXX="${TARGET_HOST}-g++" \ AR="${TARGET_HOST}-ar" \ RANLIB="${TARGET_HOST}-ranlib" \ STRIP="${TARGET_HOST}-strip" \ CFLAGS="-Os -fPIC -I$TOOLCHAIN/include" \ LDFLAGS="-L$TOOLCHAIN/lib -Wl,-rpath-link,$TOOLCHAIN/lib" # 步骤5: 编译安装 make -j$(nproc) make install # 验证结果 file install/lib/libxml2.so.2.10.3 echo "编译成功!安装目录: $(pwd)/install" ``` ### 2. 替代方案:使用通用目标标识符 ```bash #!/bin/bash # alternative_openwrt_compile.sh # 设置环境变量 export OPENWRT_SDK="/path/to/openwrt-sdk" export TOOLCHAIN="$OPENWRT_SDK/toolchain-aarch64_cortex-a53_gcc-8.4.0_musl" export PATH="$TOOLCHAIN/bin:$PATH" # 使用通用目标标识符 export GENERIC_TARGET="aarch64-linux-musl" # 进入源码目录 cd libxml2-2.10.3 # 显式指定工具链 export CC="aarch64-openwrt-linux-musl-gcc" export CXX="aarch64-openwrt-linux-musl-g++" export AR="aarch64-openwrt-linux-musl-ar" export RANLIB="aarch64-openwrt-linux-musl-ranlib" export STRIP="aarch64-openwrt-linux-musl-strip" # 配置编译参数 ./configure \ --host=$GENERIC_TARGET \ --build=$(./config.guess) \ --prefix=$(pwd)/install \ --without-python \ --without-http \ --without-ftp \ --enable-shared \ --disable-static \ --with-sysroot=$TOOLCHAIN \ CFLAGS="-Os -fPIC -I$TOOLCHAIN/include" \ LDFLAGS="-L$TOOLCHAIN/lib -Wl,-rpath-link,$TOOLCHAIN/lib" # 编译安装 make -j$(nproc) make install # 验证结果 file install/lib/libxml2.so.2.10.3 ``` ### 3. 使用 OpenWrt SDK 的完整方法 ```bash #!/bin/bash # openwrt_sdk_compile.sh # 设置 OpenWrt SDK 环境 export OPENWRT_SDK="/path/to/openwrt-sdk" cd $OPENWRT_SDK # 激活 SDK 环境 source ./build/env # 下载并编译 libxml2 包 ./scripts/feeds update ./scripts/feeds install libxml2 # 创建自定义配置(如果需要) cat > .config <<EOF CONFIG_PACKAGE_libxml2=y CONFIG_LIBXML2_THREADS=y CONFIG_LIBXML2_ZLIB=y EOF # 编译 libxml2 make package/libxml2/compile V=s # 查找编译好的包 find bin/ -name "libxml2*.ipk" # 安装到目标系统(模拟) scp bin/targets/.../libxml2*.ipk root@openwrt-device:/tmp ssh root@openwrt-device "opkg install /tmp/libxml2*.ipk" ``` ## 错误诊断和解决 ### 1. 检查工具链可用性 ```bash # 检查工具链是否存在 ls -l $TOOLCHAIN/bin # 测试编译器 aarch64-openwrt-linux-musl-gcc --version # 检查依赖库 ls $TOOLCHAIN/lib ``` ### 2. 手动验证配置 ```bash # 在 libxml2 目录中运行 ./config.sub aarch64-openwrt-linux-musl # 如果返回错误,手动添加支持 echo "aarch64-openwrt-linux-musl" | ./config.sub ``` ### 3. 创建自定义配置文件(高级) ```bash # 创建自定义 config.site 文件 cat > toolchain-config.site <<EOF # OpenWrt toolchain configuration ac_cv_host=aarch64-openwrt-linux-musl ac_cv_build=x86_64-pc-linux-gnu ac_cv_target=aarch64-openwrt-linux-musl EOF # 配置时指定自定义站点文件 CONFIG_SITE=$(pwd)/toolchain-config.site ./configure \ --host=aarch64-openwrt-linux-musl \ ... ``` ## 解释说明 ### 问题原因 1. **autoconf 版本问题**: - 项目自带的 `config.sub``config.guess` 文件过旧 - 无法识别 OpenWrt 特定的目标平台标识符 2. **OpenWrt 的特殊性**: - OpenWrt 使用 `musl` C 库而不是标准的 `glibc` - 目标平台标识符包含 `openwrt` 供应商字段 - 标准 autoconf 配置可能不包含这些特殊标识符 3. **交叉编译复杂性**: - 需要精确匹配主机、构建和目标系统类型 - 工具链路径和 sysroot 必须正确设置 ### 解决方案核心 1. **更新配置文件**: - 获取最新版本的 `config.sub``config.guess` - 手动添加 OpenWrt 特定标识符的支持 2. **显式指定工具链**: - 使用 `--host` 指定目标平台 - 通过环境变量显式设置编译器工具 - 设置 `--with-sysroot` 确保正确查找依赖库 3. **OpenWrt SDK 集成**: - 使用 OpenWrt 的包管理系统编译 - 避免手动交叉编译的复杂性 - 确保与目标系统的兼容性 ### 关键技巧 1. **通用目标标识符**: - 使用 `aarch64-linux-musl` 替代 OpenWrt 特定标识 - 显式指定工具链前缀覆盖默认设置 2. **环境隔离**: - 设置 `STAGING_DIR``SYSROOT` 环境变量 - 使用 `CFLAGS``LDFLAGS` 指定包含和库路径 3. **错误诊断**: - 使用 `file` 命令验证二进制架构 - 检查 `config.log` 获取详细错误信息 - 测试简单程序验证工具链功能
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胖胖不胖、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值