我必须编译一个依赖于 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 版本中有。