I have a problem installing a Rubygem pdfbeads
on my Ubuntu 16.04 and wonder if anyone could help.
I never used or ran ruby
before, but I needed this gem as it is required within a DJVU-to-PDF file converter script djvu2pdf.sh
I'd like to use (if interested, see Converting DJVU to PDF on Ask Ubuntu).
Installing the pdfbeads
current version 1.1.1 proved far from trivial. First, it required the installation of a newer version of ruby
than the default version 2.3 available through apt
on Ubuntu. So, to install the latest version ruby 2.7
I had to use snap
instead. Next, the dependency gem rmagick
was missing and had to be installed. That failed since it requires a newer C compiler version gcc-8
rather than the current Ubuntu default gcc-5
. To be on the safe side, I installed multiple versions gcc-6
, gcc-7
, gcc-8
and gcc-9
allowing me to select the system default version by running sudo update-alternatives --config gcc
. After all that, using the gcc-8 (v.8.3.0)
, I was able to successfully install the gem by running gem instal pdfbeads
. Finally, I was ready to run the djvu2pdf.sh
script.
However, running the script produces the following error in its last step:
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)
Line 35 in pdfbeads
requires iconv
and ruby
can't find it. Normally ruby
tries to load it from the existing ruby LOAD_PATH
, and when it fails, it searches the installed gems. Apparently, iconv
was not installed in any of the previous steps. Gem iconv
is a wrapper class for the UNIX 95 iconv()
function family, which translates string between various encoding systems. Note, however, that iconv
is not listed as a pdfbeads 1.1.1
dependency on its rubygem.org dependencies page. Also note that unpacking the pdfbeads 1.1.1
gem reveals that it was not created using the ruby bundler
as it contains no Gemfile
. Therefore, modifying the script to run pdfbeads
with bundle-exec
is of no help.
Here's where I run into the problem I can't solve. When I try installing the missing iconv
gem with gem install iconv
I get numerous C compiler error messages too long to list here. I tried running this with each different version of gcc
- 5, 6, 7, 8 and 9 and none of them succeeds. With version gcc 6.5.0
I got only one error message - make
fails after this error:
$ 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 */
The unrecognized command line option ‘-Wimplicit-fallthrough=0’ is set within the configuration file /snap/ruby/169/lib/ruby/2.4.0/x86_64-linux/rbconfig.rb
which lies on a snap
disk partition which is mounted read-only:
$ 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
With version gcc 8.3.0
, this first gcc
invocation does not cause any error, however the next one does::
"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 */
followed by a whole bunch of other errors, too long to list.
Next, I tried earlier versions of ruby - 2.6, 2.5, 2.4 - and with gcc-8
(as required for RMagick 4.0.0 package compilation), last 2 versions produce slightly fewer errors. However, when using gcc 6.5.0
I get exactly the same error with ruby 2.4
and as with ruby 2.7
.
Would anyone have any suggestion how to solve this problem?