CentOS6.9にAnacondaを使ってOpenBabel 2.4.1をインストールする時にlibstdc++ライブラリが古くて起きたエラーへの対処


概要

Anacondaを使ってケモインフォマティクス環境を構築する際にOpenBabelをインストールするのに苦労したので備忘録としてまとめます。

背景

Anaconda(version1.6.3)を使ってRDKit(version2017.03.3), OpenBabel(version2.4.1)のCentOS(6.9)へのインストールを試みました。
RDKit(version2017.03.3)は以下のコードで問題なくインストールされました。

RDKitのインストール
conda install -c rdkit rdkit

OpenBabel(version2.4.1)も以下のコードで問題なくインストールされるはずでした。

OpenBabelのインストール
conda install -c openbabel openbabel

しかし、その後python(version3.6.1)を起動しOpenBabelをimportできるかテストするとimportできませんでした

OpenBabelのimport
Python 3.6.1 |Anaconda custom (64-bit)| (default, May 11 2017, 13:09:58) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import openbabel
Traceback (most recent call last):
  File "/home/yamasakih/.pyenv/versions/anaconda-4.0.0/envs/cheminfo/lib/python3.6/site-packages/openbabel.py", line 26, in swig_import_helper
    return importlib.import_module(mname)
  File "/home/yamasakih/.pyenv/versions/anaconda-4.0.0/envs/cheminfo/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 978, in _gcd_import
  File "<frozen importlib._bootstrap>", line 961, in _find_and_load
  File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 648, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 560, in module_from_spec
  File "<frozen importlib._bootstrap_external>", line 922, in create_module
  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /home/yamasakih/.pyenv/versions/anaconda-4.0.0/envs/cheminfo/lib/python3.6/site-packages/_openbabel.so)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/yamasakih/.pyenv/versions/anaconda-4.0.0/envs/cheminfo/lib/python3.6/site-packages/openbabel.py", line 29, in <module>
    _openbabel = swig_import_helper()
  File "/home/yamasakih/.pyenv/versions/anaconda-4.0.0/envs/cheminfo/lib/python3.6/site-packages/openbabel.py", line 28, in swig_import_helper
    return importlib.import_module('_openbabel')
  File "/home/yamasakih/.pyenv/versions/anaconda-4.0.0/envs/cheminfo/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /home/yamasakih/.pyenv/versions/anaconda-4.0.0/envs/cheminfo/lib/python3.6/site-packages/_openbabel.so)

原因

「ImportError, GLIBCXX_3.4.15」とGoogle検索をするとこちらのブログがヒットし、こちらを読むとどうやらlibstdc++ライブラリのバージョンが古いことが原因のようです。

確かにインストールしようとしているサーバーはCentOS(6.9)と少し古いし、gccのバージョンを確認したところバージョンは4.4.7とこちらも古かったです。

対処

そこで、ブログに書いている説明の通りにgccをテンポリディレクトリでコンパイルしビルドされたlibstdc++.so.6.0.19へlibstdc++.so.6からシンボリックリンクを貼ることでOpenBabelをimportすることができました!

OpenBabelのimport
>>> import openbabel
>>> #エラーがでなくなりました

ただ、このlibstdc++.so.6はコンパイル時のみだけでなくimport時に毎回必要なファイルのようなので、無事importできた後に整合性をとるためにbackupをとっていた元のlibstdc++.so.6に戻したら、また同じエラーが出てしまいました。

なので、複数人で共有しているサーバーなどで行う時は、(おそらく問題ないと思いますが)新しいバージョンのlibstdc++.so.6を使い続けてよいか協議の上で使うと良いと思います。

最後に

以上でCentOS6.9にOpenBabelをインストールする時につまずいたところの説明を終わります。皆様のケモインフォマティクスライフの助けになれば幸いです。ここまでお読みいただきありがとうございました。