METIS:未定义对"METIS_WPartGraphRecursive"的引用

METIS: undefined reference to `METIS_WPartGraphRecursive'

本文关键字:METIS 引用 WPartGraphRecursive 未定义      更新时间:2023-10-16

我必须编译一个依赖于METIS库的软件,但其CMake的东西是通过禁用所有需要METIS的地方来编写的。现在,我必须再次重新启用该代码,因此代码现在取决于 METIS。

我从源代码安装了 metis-5.1.0,并编写了一个 CMake 模块来查找它(实际上我使用了这个)。我相应地修改了CMakeLists.txt,基本上添加了以下行

find_package(METIS REQUIRED)
if (METIS_FOUND)
include_directories(SYSTEM ${METIS_INCLUDE_PATH})
else (METIS_FOUND)
message (SEND_ERROR "This application cannot compile without METIS")
endif (METIS_FOUND)

最后,

target_link_libraries(<my_executable> ${METIS_LIBRARIES})

在 cmake 之后,似乎一切都很好,因为 cmake 打印:

-- Found METIS: /usr/local/include  
-- METIS libraries /usr/local/lib/libmetis.a
...
-- Configuring done
-- Generating done
-- Build files have been written to: <mylocation>

但是,在我运行make之后,我得到了

undefined reference to `METIS_WPartGraphKway'
undefined reference to `METIS_WPartGraphRecursive'

我该如何解决?

编辑: 作为附加信息,当我使用make VERBOSE=1编译时,链接器似乎在寻找正确的库,因为它包括/usr/local/lib/libmetis.a,它对应于 cmake 指定的位置并且也存在。此外,当我用nm /usr/local/lib/libmetis.a查看库时,我看到:

00000000000001c0 T METIS_WPartGraphKway
00000000000009c0 T METIS_WPartGraphRecursive

PS:在 Ubuntu 17.04 中,我尝试过使用 metis-5.1.0、metis-4.0.3 以及使用sudo apt-get install libmetis-dev进行安装。在后一种情况下,我找到libmetis.so而不是libmetis.a,但是,在这种情况下,cmake正确识别了这,链接器正确查找了它,但是最后我得到了同样的错误。

我也尝试了sudo apt-get install libmetis-dev,从 Ubuntu 5.1.0 上的源代码 metis-5.1.0 和 metis-3.0.6 安装,我遇到了同样的问题。 这似乎是一个难以解决的错误,因为许多人在METIS表格的这一页中问同样的问题。

我还尝试在编译命令的末尾添加-lmetis,如此处建议

作为附加信息,我在METIS源文件夹中进行了grep WPartGraphKway。在版本 5.1.0 中没有这样的字符串。在 4.0.3 版中有。

我解决了这样做:

  • 我安装metis-3.0
  • 我为我的软件运行cmake
  • 我跑make VERBOSE=1
  • 我复制了正在打印的最后一个gcc命令
  • 我粘贴它,在命令末尾添加-lmetis并执行命令

请注意,如果我对metis-5.1.0重复相同的操作,它不起作用,并且我遇到了与第一篇文章中写的相同的错误。