PixInsight 1.8.5 has been built with GCC 4.9.1 on Linux. Unfortunately, GCC 4.8 does not provide support for some C++ features that we use intensively in the latest versions of our development platform. Besides this, GCC 4.9 also generates somewhat faster code in our tests.
GCC 4.9 introduces a new version of the C++ standard library, namely libstdc++.so.6.0.20, which defines a new binary interface, namely CXXABI_1.3.8. Unfortunately, now-old Linux distributions, including RHEL 7.x, CentOS 7.x and Linux Mint 17 among many others, use GCC 4.8 as their system compiler and hence don't provide support for version 1.3.8 of the C++ ABI.
This problem with the installer program is actually very easy to solve. You have two main options:
- Install GCC 4.9 or newer. You can have several GCC versions installed on any Linux distribution without problems. You can install a modern GCC version using your distribution's native package manager (yum, apt-get, etc), or you can compile and build it from source (this is what I do on my development workstations with RHEL 7.2, but this option is not advisable for users without some experience in Linux administration).
- Use the libstdc++ library included in the bin/lib distribution directory. To do this, run the installer program as follows:
$ su
# cd /path/to/uncompressed/PI/distribution
# export LD_LIBRARY_PATH=./PixInsight/bin/lib
# ./installer
In this way the installer program will look for libstdc++.so.6 on the lib distribution directory, which is a symbolic link to libstdc++.so.6.0.22 on the same directory. In fact, this is exactly what the PixInsight core application does to work normally (the LD_LIBRARY_PATH variable is always set this way by the PixInsight.sh launcher script).
Now one problem remains. The PixInsightUpdater program, which is the core component of our automated update system, also requires CXXABI_1.3.8. However, the problem is that this executable is always launched by root (through SUID/SGUID bits) when the application has been installed on the standard /opt system directory. This means that PixInsightUpdater does not inherit the LD_LIBRARY_PATH variable from the core application. Instead of this, it looks for libraries on /usr/local/lib64 and /lib64, in *that* order, by means of a RUNPATH record. There are two possible solutions to this problem:
- The easy way: Create a "libstdc++.so.6" symbolic link in /usr/local/lib64, pointing to /opt/PixInsight/bin/lib/libstdc++.so.6. This should work without problems, since all system applications look for libstdc++.so.6 in /lib64. However, WARNING, by doing this you are introducing a nontrivial change in your Linux distribution. Do this at your own risk.
- The complex way: Install GCC 4.9 or newer, either with your package management system or by building it from source.
Obviously, there is a completely different solution to all of these problems: Upgrade your system to a more contemporary Linux distribution, which includes CXXABI_1.3.8 by default.
Yeah, this is Linux in its purest state