Я хочу сделать make-файл, который устанавливает библиотеку в папке мультидуги значения по умолчанию хоста, как /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 файлы оттуда, но действительно ли это - корректный подход? Папка мультидуги всегда будет там?
Другой метод I, хотя анализирует содержание ldconfig -v | grep /usr/lib/
и получая первый результат (удаляющий двоеточие).
Существует ли более легкий способ сделать это?
Я отправлю сценарии для методов, которые я нашел. Но если существует другой путь по умолчанию, отправьте его.
Используя 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 (стандартные установки, никакая внешняя архитектура) и возврат ожидаемых результатов.
Не протестированный в полях с внешней установленной архитектурой.
Я следовал 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
.