"/usr/bin/ld: cannot find -lxslt" が出て pip で lxml がインストール出来ない問題を解消
長年の問題が解決した。。。(発覚してから1年ほどで、解決に使った時間は4時間超)
python パッケージは主に pip で管理しています。たまに苦労するのが gcc でコンパイルが必要なライブラリ。BeautifulSoupとセットで使いたい lxml もコンパイルが必要なライブラリなのですが、こいつでハマりました。
- Red Hat Enterprise Linux Server release 6.7 (Santiago), Linux kvml452 2.6.32-504.8.1.el6.x86_64
- gcc version 4.4.7 20120313 (Red Hat 4.4.7-17) , Target: x86_64-redhat-linux
- Python 2.7.8 (by SCL)
状況と解決
pip install lxml を実行すると、ダウンロードした後、gccコンパイルが走り特定のところで落ちるという状況でした。
gcc -pthread -shared build/temp.linux-x86_64-2.7/src/lxml/lxml.etree.o -L/usr/lib64 -L/opt/rh/python27/root/usr/lib64 -lxslt -lexslt -lrt -lxml2 -lz -lm -lpython2.7
-o build/lib.linux-x86_64-2.7/lxml/etree.so
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../libxslt.so when searching for -lxslt
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../libxslt.a when searching for -lxslt
/usr/bin/ld: skipping incompatible /usr/lib/libxslt.so when searching for -lxslt
/usr/bin/ld: skipping incompatible /usr/lib/libxslt.a when searching for -lxslt
/usr/bin/ld: cannot find -lxslt
collect2: ld はステータス 1 で終了しました
error: command 'gcc' failed with exit status 1
# yum reinstall libxslt
...
再インストール処理の設定をしています
依存性の解決をしています
...
インストールしています : libxslt-1.1.26-2.el6_3.1.x86_64 1/2
インストールしています : libxslt-1.1.26-2.el6_3.1.i686 2/2
Verifying : libxslt-1.1.26-2.el6_3.1.x86_64 1/2
Verifying : libxslt-1.1.26-2.el6_3.1.i686 2/2インストール:
libxslt.i686 0:1.1.26-2.el6_3.1 libxslt.x86_64 0:1.1.26-2.el6_3.1完了しました!
が、それでも状況は変わらず。
そういえばコンパイルのときには devel パッケージが必要という事を思い出し。
$ yum list installed | grep xslt
以下には Red Hat Network レポジトリは表示されませんので注意してください。 RHN のレポジトリにアクセスするには root でこのコマンドを実行する必要があります。
libxslt.i686 1.1.26-2.el6_3.1 @rhel-x86_64-server-6
libxslt.x86_64 1.1.26-2.el6_3.1 @rhel-x86_64-server-6
libxslt-devel.i686 1.1.26-2.el6_3.1 @rhel-x86_64-server-6
なぜか x64版の libxslt パッケージの devel が入っていない。
$ sudo yum install libxslt-devel
...
インストール:
libxslt-devel.x86_64 0:1.1.26-2.el6_3.1完了しました!
次のファイルにシンボリックリンクがはられた。その結果、pipがエラーなく通るように!
$ pwd
/usr/lib64$ ll libxslt.so
lrwxrwxrwx 1 root root 17 10月 3 17:09 2016 libxslt.so -> libxslt.so.1.1.26
$ ll libexslt.so*
lrwxrwxrwx 1 root root 18 10月 3 17:09 2016 libexslt.so -> libexslt.so.0.8.15
試行錯誤した事
そうとう試行錯誤しちゃいましたが、incompatible とメッセージにあったので、いらぬ頭が働いたのが敗因でしょうか?
- incompatible とあるから、変なの見っけてるな
- gcc 古いんじゃねぇ?
- update してみたけど、かわらず (4.4.5 -> 4.4.7)
- gcc のコンパイルオプションが不足してるんちゃうん?
- export CFLAGS="-m64" してからpipしてみた。確かにすべてのコンパイルに -m64 付けれたけど、同じところでエラー
- でも ldconfig -p にも コンパイルオプションにも /usr/lib64 はあるわけだし
- ココらへんで、必要なものが無いのではの路線に切り替わっていった
- ネットに libxml2 も必要って書いてあるけど?
- libxml2-devel.x86_64 は確かに不足していた (libxslt の後に処理されるみたいで、まだエラーになってなかった)
- 32bit版はいってるのに64bit版が不足してるライブラリのせいじゃね?
- 差が40程度あったので、個別に確認するのを断念 (ここで断念したのも敗因の一つか)
結果 incompatible は、たまたま必要なファイル名がヒットしたら互換性がなかったということだろうと考えられるようになり、/usr/lib64/libxslt.so があればいいのだという発想につながりました。
参考
次の記事に助けられて、各種理解しながら進められました。感謝です!
- 共有ライブラリの追加 - tetsuyai’s blog
- GCCのデフォルトオプションを知るには - Qiita
- pythonインタープリタが32ビットと64ビットのどちらで動作しているかを確認する方法 - stMind
- ファイルがどのパッケージに含まれているかをyum/aptで調べる方法 - 憩いの場【Linux】
こっちで同じ類似の問題でてたなぁ。がんばって回答してみたけど、holding したコメント欄にすでに回答あったし(汗
その他
あれ?過去にも同じような事やったなぁと思い出して振り返れば、同様の対応やってるし。
こっちも再検証してみると、必要ライブラリ か ldconfig のパスの問題だけのような気がする。
※CentOSも、たぶんですが同様の事がありそうということでカテゴリーにいれました