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

时间:2015-02-26 02:06:21

标签: c++ cmake mpi

我试图用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。有谁知道这是正常的还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

最有可能的是,你做错了什么。

find_package调用应该填充缓存中的相应变量。只要find_package调用返回,您就应该能够使用结果。

关于可能出现的问题:

  • 在尝试使用结果之前,请确认您确实执行了find_package调用。这对于简单的CMake文件应该是直截了当的,但对于更复杂的构建脚本来说可能非常具有挑战性。大量使用message命令应该有助于调试它。
  • 一旦确定find_package调用发生在正确的位置,您需要确定导致它在第二次运行时成功的原因,而在第一次运行时失败。最有可能的是,在调用find_package之后,在CMake脚本中的某处设置了一个缓存变量。在第二次运行时,缓存的值可用于查找脚本,并允许它完成其作业。检查find脚本的源,以确定它取决于全局和/或缓存变量值的位置。