如何确定主机 Multi-Arch 默认文件夹

如何确定主机 Multi-Arch 默认文件夹

我想编写一个 makefile,在主机默认的多架构文件夹中安装一个库,如/usr/lib/x86_64-linux-gnu/usr/lib/i386-linux-gnu//usr/lib/arm-linux-gnueabihf

但是如果不使用dpkg-architecturedebhelper它们并不总是存在于主机设备上。

仅使用gccmake

我已经找到了该/etc/ld.so.conf.d文件夹。我可以从那里解析 *.conf 文件,但这是正确的方法吗?多架构文件夹会一直存在吗?

我认为另一种方法是解析内容ldconfig -v | grep /usr/lib/并获取第一个结果(删除冒号)。

有没有更简单的方法可以做到这一点?

答案1

我将发布我找到的方法的脚本。但如果有其他默认方法,请发布。

使用 ldconfig:

ldconfig -v 2>>/dev/null | grep /usr/lib* | head --lines=1 | sed -e 's/://'

我猜测如果有人配置了另一个搜索顺序它可以返回另一个文件夹,例如在默认主机多架构文件夹之前添加另一个文件夹。

使用/etc/ld.so.conf.d文件夹:

lines=$(cat /etc/ld.so.conf.d/* 2>>/dev/null)
for line in $lines ; do
    case "$line" in
    *Multiarch*)
        found_multiarch=1
        ;;
    /usr/lib/*)
        if [ "$found_multiarch" = 1 ] ; then
            folder=$line
            break
        fi
        ;;
    esac
done
echo $folder

它将返回/usr/lib行之后的第一个文件夹*Multiarch*

两个脚本都在 armv7 和 x86_64(默认安装,无外部架构)上进行了测试并返回了预期结果。

未在安装了外部架构的盒子中进行测试。

答案2

我遵循的dpkg-architecture只是一个 Perl 脚本:

$ which dpkg-architecture 
/usr/bin/dpkg-architecture

$ file /usr/bin/dpkg-architecture
/usr/bin/dpkg-architecture: a /usr/bin/perl script, UTF-8 Unicode text executable

$ more /usr/bin/dpkg-architecture
use Dpkg::Arch qw(get_raw_build_arch get_raw_host_arch get_host_gnu_type
                  debarch_to_cpuattrs
                  get_valid_arches debarch_eq debarch_is debarch_to_debtriplet
                  debarch_to_gnutriplet gnutriplet_to_debarch
                  debarch_to_multiarch);

$ man Dpkg::Arch

$ locate "Dpkg/Arch"
/usr/share/perl5/Dpkg/Arch.pm

$ more /usr/share/perl5/Dpkg/Arch.pm

## this may fails if multi-arch is not supported
$ dpkg --print-architecture
amd64

## it seems this what are you looking for
$ gcc -dumpmachine
x86_64-linux-gnu

有一件事可能是一个缺点,在i386安装gcc -dumpmachine报告中i686-linux-gnu。它会正常工作,因为/usr/lib/i686-linux-gnuldconfig列表中也与相同/usr/lib/i386-linux-gnu;但是,Ubuntu 默认创建的文件夹是/usr/lib/i386-linux-gnu

相关内容