【问题标题】:Link OpenMPI against libc++将 OpenMPI 与 libc++ 链接
【发布时间】:2016-03-03 10:18:28
【问题描述】:

我正在运行 OpenSUSE 13.2,由于各种原因,我正在处理的项目需要 OpenMPI 链接到 libc++ 而不是 libstd++

我已经尝试设置以下环境变量:

CXX <path>/llvm-3.8/bin/clang++
CC <path>/llvm-3.8/bin/clang
OMPI_CC <path>/llvm-3.8/bin/clang
OMPI_CXX <path>/llvm-3.8/bin/clang++

虽然这确实使用 clang 进行编译,但它仍然链接到 libstdc++,这从在 openmpi bin 文件夹中的各种可执行文件上运行的以下命令得到证实:

openmpi-1.10.2/bin > ldd vtc++
        linux-vdso.so.1 (0x00007ffc9f0ed000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007ffb1f2cd000)
        libm.so.6 => /lib64/libm.so.6 (0x00007ffb1efcb000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ffb1edb4000)
        libc.so.6 => /lib64/libc.so.6 (0x00007ffb1ea0d000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ffb1f611000)

还有:

openmpi-1.10.2/bin > objdump -x vtc++ | grep NEEDED
  NEEDED               libstdc++.so.6
  NEEDED               libm.so.6
  NEEDED               libgcc_s.so.1
  NEEDED               libc.so.6

非常感谢任何建议。

【问题讨论】:

  • 您需要传递一个-stdlib=... 参数。
  • 我的意思是 OpenMPI 库本身需要针对 libc++ 构建,而不是我使用 OpenMPI 编写的程序?
  • 一切都需要使用相同的标准库(包括所有静态库和共享库)构建,否则您会得到未定义的行为,并且会出现非常讨厌的调试问题(到处都是 ODR 违规)
  • 您为什么要删除您在 SO 上与 UNIX.SE 并行提出的相同问题,我在 cmets 中向您解释了所有内容?
  • @Zulan 这是迁移到这里的,它们是相同的,所以我不得不删除一个。我不是故意粗鲁,但你的解释并没有真正回答我的问题,因为我不相信你完全理解我在问什么。由于这两个问题都没有合适的 cmets / 答案,所以我选择哪一个并不重要。

标签: opensuse libraries linker mpi


【解决方案1】:

感谢@Zulan 和@Mat 的帮助。

我的问题是,虽然我设置了正确的编译器,但我没有将 -stdlib=c++ 标志传递给它。要在 OpenMPI 构建中执行此操作,特别是使用 configure,您必须将 CFLAGSCXXFLAGS 环境变量设置为包含 -stdlib=libc++。我通过带有prepend-path 的模块文件做到了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多