我想编写一个 makefile,在主机默认的多架构文件夹中安装一个库,如/usr/lib/x86_64-linux-gnu
和/usr/lib/i386-linux-gnu/
和/usr/lib/arm-linux-gnueabihf
。
但是如果不使用dpkg-architecture
,debhelper
它们并不总是存在于主机设备上。
仅使用gcc
和make
。
我已经找到了该/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-gnu
在ldconfig
列表中也与相同/usr/lib/i386-linux-gnu
;但是,Ubuntu 默认创建的文件夹是/usr/lib/i386-linux-gnu
。