cmake 不会设置MPI_C_LIBRARIES,除非它运行两次

cmake doesn't set MPI_C_LIBRARIES unless it's run twice

本文关键字:运行 两次 设置 MPI cmake LIBRARIES      更新时间:2023-10-16

我正在尝试使用cmake编译带有MPI的C++代码。在CMakeLists.txt中,我有:

find_package(MPI)

以及后来的

if(MPI_FOUND)
    MESSAGE("{MPI_C_LIBRARIES}")
    target_link_libraries(test ${MPI_C_LIBRARIES})
endif(MPI_FOUND)

我安装了OpenMPI。我第一次运行cmake时得到:

--找到MPI_CXX:/usr/local/lib/libmpi_CXX.dylib/usr/local/lib/libmpi.dylib

以及应该打印MPI_C_LIBRARIES的空行。如果我尝试这样做,它不会链接到MPI库,并给出一个错误。然而,如果我第二次运行cmake,我会正确地得到消息:

/usr/local/lib/libmpi_cxx.dylib/usr/local/lib/libmpi.dylib

它与图书馆的链接也很好。总之,我必须运行cmake两次,以确保设置了MPI_C_LIBRARIES。有人知道这是正常的还是我做错了什么吗?

很可能是您做错了什么。

find_package调用应该填充缓存中的各个变量。一旦find_package调用返回,您就应该能够使用结果。

至于可能出了什么问题:

  • 在尝试使用结果之前,请验证是否确实执行了find_package调用。这对于一个简单的CMake文件来说应该很简单,但对于更复杂的构建脚本来说可能很有挑战性。大量使用message命令应该有助于调试此问题
  • 一旦确定find_package调用发生在正确的位置,就需要确定是什么原因导致它在第二次运行中成功,而在第一次运行中失败。最有可能的是,在调用find_package之后,在CMake脚本中的某个地方设置了一个缓存变量。在第二次运行时,缓存的值可用于find脚本,从而使其能够完成作业。检查find脚本的源,以确定它依赖于全局和/或缓存变量值的位置