【发布时间】:2018-02-07 13:01:25
【问题描述】:
我必须编译一个依赖 METIS 库的软件,但是它的 CMake 东西是通过禁用所有需要 METIS 的地方来编写的。现在,我必须再次重新启用该代码,因此该代码现在取决于 METIS。
我从源代码安装了metis-5.1.0,并编写了一个CMake模块来找到它(实际上我使用了this one)。我相应地修改了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
P.S.:在 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 论坛的this page 中提出了同样的问题。
我也尝试在编译命令末尾添加-lmetis,建议here
作为附加信息,我在 METIS 源文件夹中做了一个grep WPartGraphKway。在 5.1.0 版本中没有这样的字符串。在 4.0.3 版本中有。
【问题讨论】:
-
您确定您显示的可执行文件报告了“未解析的引用”,而不是另一个可执行文件/库吗?将
VERBOSE=1选项设置为make,您可能会看到用于编译和链接的完整命令行,并检查是否实际执行了与metis 库的链接。 -
谢谢,我用
VERBOSE=1的输出编辑了这个问题
标签: c++ cmake linker-errors undefined-reference metis