0

我必须编译一个依赖于 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 14.04 上从源代码 metis-5.1.0 和 metis-3.0.6 安装,我遇到了同样的问题。这似乎是一个难以解决的错误,因为许多人在 METIS 论坛的这个页面上提出了同样的问题。

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

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

4

1 回答 1

0

我解决了这样做:

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

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

于 2017-09-21T01:49:43.410 回答