![构建可执行文件但出现共享库](https://linux22.com/image/1067720/%E6%9E%84%E5%BB%BA%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E4%BD%86%E5%87%BA%E7%8E%B0%E5%85%B1%E4%BA%AB%E5%BA%93.png)
我是新手,不熟悉 Linux 操作系统。我目前使用的操作系统是 Ubuntu 19.10。
我试图建立一个 SPPARKS(一个软件https://spparks.sandia.gov/index.html) 可以通过“make mpi”来执行。这个过程没有错误,但是生成的是一个 spk_mpi 的“共享库”文件,而不是一个“可执行”文件。
我将非常感激您的帮助。非常感谢。
答案1
这实际上与前面的问题中讨论的问题相同:
解决方案基本上就像提到的那样
您特定情况所面临的挑战是如何通过 MPI 编译器包装器传递适当的编译器/链接器选项。
在我的 18.04 系统上,OpenMPI 版本指示为
$ mpicc --showme:version
mpicc: Open MPI 2.1.1 (Language: C)
并明确选择 gcc/g++ 版本 5,我能够使用以下命令行获得传统的非 PIE 可执行文件(\
为便于阅读,用行连续符分隔):
OMPI_CC=gcc-5 OMPI_CXX=g++-5 \
OMPI_CFLAGS=-fno-pic OMPI_CXXFLAGS=-fno-pic OMPI_LDFLAGS=-no-pie \
make mpi
使用以下命令确认file
:
$ file spk_mpi
spk_mpi: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=284d76d1ca642cca833b31dfa028a7910e935600, not stripped
如果您正在使用其他 MPI 实现,那么您将需要弄清楚如何传递适当的标志。
注意:您可能需要make clean-all
先运行以删除之前没有该-fno-pic
标志编译的任何对象。