У меня проблема с установкой Rubygem pdfbeads
на мою Ubuntu 16.04 и я думаю, что кто-нибудь может помочь.
Я никогда раньше не использовал или не запускал ruby
, но мне понадобился этот драгоценный камень, так как он необходим в скрипте конвертера файлов DJVU в PDF djvu2pdf.sh
Я хотел бы использовать (если интересно, см. Преобразование DJVU в PDF в Ask Ubuntu).
Установка pdfbeads
текущей версии 1.1.1 оказалась далеко не тривиальной. Во-первых, потребовалась установка более новой версии ruby
, чем версия 2.3 по умолчанию, доступная через apt
в Ubuntu. Итак, для установки последней версии ruby 2.7
мне пришлось использовать snap
. Затем гем зависимости rmagick
отсутствовал и должен был быть установлен. Это не удалось, поскольку для этого требуется более новая C версия компилятора gcc-8
, а не текущее значение по умолчанию Ubuntu gcc-5
. Чтобы быть в безопасности, я установил несколько версий gcc-6
, gcc-7
, gcc-8
и gcc-9
, что позволило мне выбрать версию системы по умолчанию, запустив sudo update-alternatives --config gcc
. После всего этого, используя gcc-8 (v.8.3.0)
, я смог успешно установить гем, запустив gem instal pdfbeads
. Наконец, я был готов запустить сценарий djvu2pdf.sh
.
Однако при запуске сценария на последнем шаге возникает следующая ошибка:
Building the final pdf
Traceback (most recent call last):
4: from ~/.gem/bin/pdfbeads:23:in '<main>'
3: from ~/.gem/bin/pdfbeads:23:in 'load'
2: from ~/.gem/gems/pdfbeads-1.1.1/bin/pdfbeads:35:in '<top (required)>'
1: from /snap/ruby/172/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in 'require'
/snap/ruby/172/lib/ruby/2.7.0/rubygems/core_ext/kernel_require.rb:92:in 'require':
cannot load such file -- iconv (LoadError)
Строка 35 в pdfbeads
требует iconv
и ruby
не могут его найти. Обычно ruby
пытается загрузить его из существующего ruby LOAD_PATH
, а в случае сбоя он ищет установленные драгоценные камни. Очевидно, iconv
не был установлен ни на одном из предыдущих шагов. Gem iconv
- это класс-оболочка для семейства функций UNIX 95 iconv()
, который транслирует строки между различными системами кодирования. Однако обратите внимание, что iconv
не указан как pdfbeads 1.1.1
зависимость на странице rubygem.org зависимости . Также обратите внимание, что распаковка драгоценного камня pdfbeads 1.1.1
показывает, что он не был создан с использованием ruby bundler
, так как он не содержит Gemfile
. Поэтому изменение сценария для запуска pdfbeads
с помощью bundle-exec
не поможет.
Здесь я сталкиваюсь с проблемой, которую не могу решить. Когда я пытаюсь установить отсутствующий iconv
gem с gem install iconv
, я получаю множество C сообщений об ошибках компилятора, слишком длинных для перечисления здесь. Я пытался запустить это с каждой другой версией gcc
- 5, 6, 7, 8 и 9, и ни одна из них не удалась. С версией gcc 6.5.0
я получил только одно сообщение об ошибке - make
терпит неудачу после этой ошибки:
$ cat mkmf.log
"gcc -o conftest -I/snap/ruby/172/include/ruby-2.7.0/x86_64-linux -I/snap/ruby/172/include/ruby-2.7.0/ruby/backward
-I/snap/ruby/172/include/ruby-2.7.0 -I. -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond
-Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings
-Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long
-Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality
-Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format
-Wsuggest-attribute=noreturn -Wunused-variable -fPIC conftest.c -L. -L/snap/ruby/172/lib -Wl,-rpath,/snap
/ruby/172/lib -L. -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/snap/ruby/172/lib
-L/snap/ruby/172/lib -lruby -lm -lc"
gcc: error: unrecognized command line option ‘-Wimplicit-fallthrough=0’; did you mean ‘-Wno-fallthrough’?
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: int main(int argc, char **argv)
4: {
5: return !!argv[argc];
6: }
/* end */
Нераспознанный параметр командной строки '-Wimplicit-fallthrough = 0' установлен в файле конфигурации /snap/ruby/169/lib/ruby/2.4.0/x86_64-linux/rbconfig.rb
который находится на snap
дисковом разделе, смонтированном только для чтения:
$ grep "[[:space:]]ro[[:space:],]" /proc/mounts | grep ruby
/dev/loop15 /snap/ruby/170 squashfs ro,nodev,relatime 0 0
/dev/loop33 /snap/ruby/169 squashfs ro,nodev,relatime 0 0
В версии gcc 8.3.0
этот первый вызов gcc
не вызывает никаких ошибок, однако следующий вызов: :
"gcc -o conftest -I/snap/ruby/172/include/ruby-2.7.0/x86_64-linux -I/snap/ruby/172/include/ruby-2.7.0/ruby/backward
-I/snap/ruby/172/include/ruby-2.7.0 -I. -O3 -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond
-Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings
-Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long
-Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality
-Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format
-Wsuggest-attribute=noreturn -Wunused-variable -fPIC conftest.c -L. -L/snap/ruby/172/lib -Wl,-rpath,/snap/ruby/172/lib -L.
-fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/snap/ruby/172/lib -L/snap/ruby/172/lib -lruby -lm -lc"
//snap/core18/current/lib/x86_64-linux-gnu/libcrypt.so.1: undefined reference to '__open_nocancel@GLIBC_PRIVATE'
/snap/ruby/172/lib/libruby.so: undefined reference to 'getrandom@GLIBC_2.25'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '_IO_enable_locks@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__mmap@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__munmap@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libdl.so.2: undefined reference to '_dl_catch_error@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__mprotect@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libcrypt.so.1: undefined reference to '__snprintf@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__tunable_get_val@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libcrypt.so.1: undefined reference to '__read_nocancel@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/librt.so.1: undefined reference to '__close_nocancel@GLIBC_PRIVATE'
/snap/ruby/172/lib/libruby.so: undefined reference to 'copy_file_range@GLIBC_2.27'
//snap/core18/current/lib/x86_64-linux-gnu/libpthread.so.0: undefined reference to '__sigtimedwait@GLIBC_PRIVATE'
//snap/core18/current/lib/x86_64-linux-gnu/libdl.so.2: undefined reference to '_dl_signal_error@GLIBC_PRIVATE'
/snap/ruby/172/lib/libruby.so: undefined reference to '__explicit_bzero_chk@GLIBC_2.25'
collect2: error: ld returned 1 exit status
checked program was:
/* begin */
1: #include "ruby.h"
2:
3: #include <ruby/encoding.h>
4:
5: /*top*/
6: extern int t(void);
7: int main(int argc, char **argv)
8: {
9: if (argc > 1000000) {
10: int (* volatile tp)(void)=(int (*)(void))&t;
11: printf("%d", (*tp)());
12: }
13:
14: return !!argv[argc];
15: }
16: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_enc_get; return !p; }
/* end */
, за которым следует целый ряд других ошибок, слишком длинных для перечисления.
Затем я попробовал более ранние версии ruby - 2.6, 2.5, 2.4 - и с gcc-8
(как требуется для компиляции пакета RMagick 4.0.0), последние 2 версии дают немного меньше ошибок. Однако при использовании gcc 6.5.0
я получаю точно такую же ошибку с ruby 2.4
и с ruby 2.7
.
У кого-нибудь есть какие-либо предложения, как решить эту проблему?