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
的,但是最后居然没有链接上。