Следующая ссылка решила для меня эту проблему. Как вы можете ссылаться на конкретную версию разделяемой библиотеки в GCC
Выдержка из ссылки, которая помогла мне-
Вместо того, чтобы использовать "-lcurl", используйте "-l:libcurl.so.3". " И конечно же используйте "-L _installed_path_"
Моя ошибка была обратной - "Неправильная версия библиотеки JPEG: библиотека 80, вызывающий абонент ожидает 62"
Чтобы узнать с какой jpeg библиотекой был скомпонован мой бинарник, я сделал-
ldd my_binary | grep jpeg
вывод был-
libjpeg.so.8 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.8
Очевидно, что бинарник зависел от libjpeg8 (библиотека 80), поэтому я и получил ошибку.
Чтобы узнать, действительно ли у меня в системе есть libjpeg62, я сделал
ldconfig -p | grep jpeg
вывод был-
libplayerjpeg.so.3.0 (libc6,x86-64) => /usr/lib/libplayerjpeg.so.3.0
libopenjpeg.so.2 (libc6,x86-64) => /usr/lib/libopenjpeg.so.2
libjpeg.so.62 (libc6,x86-64) => /usr/local/lib/libjpeg.so.62
libjpeg.so.62 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.62
libjpeg.so.8 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.8
libjpeg.so.8 (libc6) => /usr/lib/i386-linux-gnu/libjpeg.so.8
libjpeg.so (libc6,x86-64) => /usr/local/lib/libjpeg.so
libjpeg.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so
Так что в моем случае, вместо того, чтобы просто использовать -ljpeg, я использовал это (в файле make)-
-L/usr/lib/x86_64-linux-gnu/ -l:libjpeg.so.62
Не забудьте заменить #include (jpeglib.h> в вашем cpp-файле на
extern "C" {
#include "jpeglib.h" }
$ eval echo -e "n\ $d/$prf.00{2..$last}.tar\\\n"
n someprefix.002.tar
n someprefix.003.tar
n someprefix.004.tar
Как этот пробел попал внутрь?
Ответ в двух словах: это аналогично выводу, который вы получите, если повторите строку с расширением имени файла на кучке файлов, имена которых заканчиваются на новую строку.
Как описано в Brace expansion:
Шаблоны, которые должны быть развернуты с помощью скобок, принимают форму необязательной преамбулы, за которой следует либо серия строк, разделенных запятыми, либо выражение последовательности между парой скобок, за которым следует необязательный постскриптум.
Итак, оболочка вычисляет
echo -e n\ dir/prefix00{2..4}.tar\\n
^preamble^^^^^^ ^postscript
И, как и в случае с расширением имени файла, она вставляет пробел между каждым развернутым элементом, так что вы получаете (для ясности я сохраняю здесь экранирующую последовательность \n):
n dir/prefix002.tar\n n dir/prefix003.tar\n n dir/prefix004.tar\n\n
QED.
Что касается вашего основного вопроса о том, как в скрипте подавать tar
информацию для прохождения через несколько томов, вот два способа:
seq
для генерации команд n
:seq -f "n $d/$prf.%03g.tar" 2 $last | tar -Mtvf $d/$prf.001.tar
tar
--new-volume-script
: echo '#!/bin/sh' > ./newvol echo "printf $d/$prf.%03d.tar \$TAR_VOLUME >&\$TAR_FD" >> ./newvol chmod +x ./newvol tar -Mtvf $d/$prf.001.tar --new-volume-script=./newvol