読者です 読者をやめる 読者になる 読者になる

AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

"/usr/bin/ld: cannot find -lxslt" が出て pip で lxml がインストール出来ない問題を解消

長年の問題が解決した。。。(発覚してから1年ほどで、解決に使った時間は4時間超)

python パッケージは主に pip で管理しています。たまに苦労するのが gccコンパイルが必要なライブラリ。BeautifulSoupとセットで使いたい lxml もコンパイルが必要なライブラリなのですが、こいつでハマりました。

状況と解決

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

  • lxslt が見つからないとなってるので xslt パッケージが関係しているのだろうと推測。yumで見てもインストール済みなので、再インストールすれば正常になるのではと思い実行

# yum reinstall libxslt
...
再インストール処理の設定をしています
依存性の解決をしています

    • > トランザクションの確認を実行しています。
      • > Package libxslt.i686 0:1.1.26-2.el6_3.1 will be 再インストール
      • > Package libxslt.x86_64 0:1.1.26-2.el6_3.1 will be 再インストール
    • > 依存性解決を終了しました。

...
インストールしています : 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 とあるから、変なの見っけてるな
    • /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../libxslt.so は 32bitライブラリの /usr/lib/libxslt.so を参照してた。が、gccのフォルダ名は x86_64 なんて書いてあるので gcc を疑ってみた
  • 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 があればいいのだという発想につながりました。

その他

あれ?過去にも同じような事やったなぁと思い出して振り返れば、同様の対応やってるし。

こっちも再検証してみると、必要ライブラリ か ldconfig のパスの問題だけのような気がする。

CentOSも、たぶんですが同様の事がありそうということでカテゴリーにいれました