【发布时间】: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