【问题标题】:cmake doesn't set MPI_C_LIBRARIES unless it's run twicecmake 不会设置 MPI_C_LIBRARIES 除非它运行两次
【发布时间】:2015-04-28 06:53:54
【问题描述】:

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

【问题讨论】:

    标签: c++ cmake mpi


    【解决方案1】:

    很可能,你做错了什么。

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

    至于可能出了什么问题:

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

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多