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
的,但是最後居然沒有連結上。