web-dev-qa-db-ja.com

Python:cairoエラー(2.7&3.6)のインポート未定義シンボル:cairo_tee_surface_index

Python 2.7:でgtkをインポートしようとすると、次のエラーが発生します。

>>> import gtk Traceback (most recent call last): File "<stdin>", line 1, in <module> File "gtk/__init__.py", line 40, in <module> from gtk import _gtk File "/usr/lib/python2.7/site-packages/cairo/__init__.py", line 1, in <module> from ._cairo import * # noqa: F401,F403 ImportError: /usr/lib/python2.7/site-packages/cairo/_cairo.so: undefined symbol: cairo_tee_surface_index

また、Python 3.6からcairoをインポートしようとすると、次のエラーが発生します。

>>> import cairo Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.6/site-packages/cairo/__init__.py", line 1, in <module> from ._cairo import * # noqa: F401,F403 ImportError: /usr/lib/python3.6/site-packages/cairo/_cairo.cpython-36m-x86_64-linux-gnu.so: undefined symbol: cairo_tee_surface_index

BLFSの本に記載されている順序でモジュールをコンパイルおよびビルドしました。また、本に記載されているように、ティーを有効にしてカイロをインストールしました。

私のシステムはLFSで、カーネルバージョンは4.14.4、Python 2.7.14およびPython 3.6.4)です。

編集:ソースをダウンロードし、「makeuninstall」を実行してから再インストールしました。これで、エラーなしでcairoをインポートできます。

10
rmn

古いバージョンのpycairoに移行しました。バージョン1.11.0をダウンロードしてみてください。

pip uninstall pycairo pip install pycairo==1.11.0

利用可能な他のバージョンにシフトすることもできます。現時点では;彼らです:-

1.11.0, 1.11.1, 1.12.0, 1.13.0, 1.13.1, 1.13.2, 1.13.3, 1.13.4, 1.14.0, 1.14.1, 1.15.0, 1.15.1, 1.15.2, 1.15.3, 1.15.4, 1.15.5, 1.15.6, 1.16.0, 1.16.1, 1.16.2, 1.16.3, 1.17.0, 1.17.1, 1.18.0

明らかに;よくわかりませんが、ブルートフォースを使って解決しました。それが役に立てば幸い。

3
Vicrobot

Condaを使用していますが、同じ問題がありますが、conda envのためにパスが少し異なります:ImportError: /home/juro/anaconda3/envs/py37/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so: undefined symbol: cairo_tee_surface_index $ ldd /home/juro/anaconda3/envs/py37/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so $ outputs: ... libcairo.so.2 => /home/juro/anaconda3/envs/py37/lib/libcairo.so.2 (0x00007ff6d8ad9000) ...

Conda(anaconda)パッケージcairoが壊れているか、pip pycairoパッケージが壊れているようです(誰のせいなのかわかりません;))。 「libcairo.so.2」ライブラリにシンボルcairo_tee_surface_indexがありません。そのシンボルはpycairoパッケージ(pip install pycairo)で必要とされるため、「importcairo」を実行すると失敗します。

次のオプションがあります。

  1. 私のシステム(debian)libcairo.2に欠落している記号があることがわかりました:$ strings /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.8 | grep cairo_tee_surface_index。そのため、コンダのカイロをシステムと同じバージョンにダウングレードしましたconda install cairo=versionそして私のシステムlibcairoを私のcondalibcairoにコピーしました:cp /usr/lib/x86_64-linux-gnu/libcairo.so.2.11400.8 ~/anaconda3/lib/libcairo.so.2.11400.8。元のライブラリをバックアップすることはできますが、これらのライブラリはハードリンクであるため、moveコマンド(mv)は使用しないでください(これらのライブラリは複数のconda環境間で共有できます)。バックアップにはcpだけを使用します。
  2. Chrpathコマンド(man chrpath)を使用して、「_ cairo.cpython-36m-x86_64-linux-gnu.so」ライブラリファイル内のRPATHを変更して、正しいlibcairo.so.2があるフォルダーを指すようにすることができます。正しいものとは、cairo_tee_surface_indexシンボルを使用してライブラリを構築することを意味します。
  3. 独自のcairoライブラリ(conda '$ conda list cairo'と同じバージョン)を作成し、〜/ anaconda3/lib/libcairo.so.2。{additional_version_characters}にコピーします。

システムのlibcairoはどこにありますか? /sbin/ldconfig -p | grep libcairo

2
Juraj Michalak

cairocffiをインストールし、import cairocffiimport cairocffi as cairoに置き換えます。

2
neouyghur

私のために、
ldd /usr/lib64/python3.6/site-packages/cairo/_cairo.cpython-36m-x86_64-linux-gnu.so
表示:libcairo.so.2 =>/usr/local/lib/libcairo.so.2

古い自己コンパイルされたcairoインストールがありました。元のコンパイルツリーがまだある場合は、その中でmake uninstallを実行できます。それ以外の場合は、/ usr/local/lib内の問題のあるcairoファイルを手動で別の場所に移動し、ファイルが不要であることが確認できたら削除します。

0
Ron Humble

ルートエラーがpy3cairo.hを見つけていないことがわかりました

locate py3cairo.h、およびln -s /usr/include/pycairo/py3cairo.h /usr/include/py3cairo.hだけ

その後、コンパイルはエラーなしで機能します。

0
Jingpeng Wu

これは、Juraj Michalakの1番とcondaundefined symbol: cairo_tee_surface_index、詳細なプロセス。

>>> import cairo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/__init__.py", line 1, in <module>
    from ._cairo import *  # noqa: F401,F403
ImportError: /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so: undefined symbol: cairo_tee_surface_index

私が持っています cairo_tee_surface_indexシンボルはcairo(1.14.12)にありますが、libcairoにはありません。

ldd /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so
    libcairo.so.2 => /home/lalebarde/anaconda3/lib/libcairo.so.2 (0x00007f5a82de8000)
strings /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so | grep cairo_tee_surface_index
cairo_tee_surface_index
cairo_tee_surface_index
cairo_tee_surface_index
strings /home/lalebarde/anaconda3/lib/libcairo.so.2 | grep cairo_tee_surface_index

私のシステム1は大丈夫です(1.14.8-1):

strings /usr/lib/x86_64-linux-gnu/libcairo.so.2 | grep cairo_tee_surface_index
cairo_tee_surface_index

だから、私が試したのは、cairoenvironmentの下のcondaを私のシステムのバージョンにダウングレードすることです(バージョン1.14.8の場合はcondaリポジトリからダウンロード ここ )、デフォルトのlibを、シンボルが欠落しているシステムに置き換えるには、次のようにします。

conda uninstall cairo
The following packages will be REMOVED:
  cairo-1.14.12-h8948797_3
conda install cairo-1.14.8-0.tar.bz2

また:

ldd /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so 
    libcairo.so.2 => /home/lalebarde/anaconda3/lib/libcairo.so.2 (0x00007f9b163c9000)
strings /home/lalebarde/anaconda3/lib/python3.7/site-packages/cairo/_cairo.cpython-37m-x86_64-linux-gnu.so | grep cairo_tee_surface_index
cairo_tee_surface_index
cairo_tee_surface_index
cairo_tee_surface_index
strings /home/lalebarde/anaconda3/lib/libcairo.so.2 | grep cairo_tee_surface_index

期待する以外に何もありません。今、私はそれをシステムのものと交換します:

cp /home/lalebarde/anaconda3/lib/libcairo.so.2 /home/lalebarde/anaconda3/lib/libcairo.so.2.old
cp /usr/lib/x86_64-linux-gnu/libcairo.so.2 /home/lalebarde/anaconda3/lib/
strings /home/lalebarde/anaconda3/lib/libcairo.so.2 | grep cairo_tee_surface_index
cairo_tee_surface_index

さて、import cairo動作します!

0
lalebarde