pip install METIS

0x7F發表於2024-07-20

python 的包 METIS 需要在本地安裝 METIS,METIS 本身又是依賴 GKlib 的,所以需要首先編譯 GKlib,然後編譯 METIS

編譯 GKlib

make config CONFIG_FLAGS='-D BUILD_SHARED_LIBS=ON -D CMAKE_INSTALL_PREFIX=/home/hongyu_gao2001/GKlib'

編譯 METIS

make config shared=1 cc=gcc prefix=/home/hongyu_gao2001/METIS gklib_path=/home/hongyu_gao2001/GKlib

這裡 gklib_path 或許是重要的,不知道不加能不能行

undefined symbol

編譯後執行 python 程式報錯 libmetis.so: undefined symbol: gk_jbufs

ldd libmetis.so 會發現並沒有 libGKlib.so

$ ldd libmetis.so 

linux-vdso.so.1 (0x00007fff1b54c000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x000079f3f6980000)
/lib64/ld-linux-x86-64.so.2 (0x000079f3f6bf9000)

最終的解決方案來自這裡

實際做的處理就是向 libmetis/CMakeLists.txt 中新增了一句 target_link_libraries(metis GKlib)

然後 ldd 的結果中就應該會包含 libGKlib.so

ldd libmetis.so 

linux-vdso.so.1 (0x00007ffe573f8000)
libGKlib.so => /home/hongyu_gao2001/GKlib/lib/libGKlib.so (0x00007f8291508000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f82912d6000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8291594000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f82911ef000)

所以實際原因應該就是即使 GKlib 正確安裝了,但是還連結上,不過這個問題很神奇,因為我明明看到編譯指令中是包含 -lGKlib 的,但是最後居然沒有連結上。

相關文章