繁体   English   中英

C ++:从静态库制作共享库

[英]c++: making a shared object from a static library

我们正在尝试制作一个c ++共享库,以与静态的fortran库(与mpif90编译)对接。 有一个用gfortran或mpif90编译的fortran包装器文件(均失败)和一个用g ++编译的c ++包装器文件

编译命令是

g++ -std=c++11 -ftemplate-depth-256 -Wno-inline -fPIC -O3 -pthread -fopenmp -v  -I /usr/lib/x86_64-linux-gnu/openmpi/include/ -I /opt/local/nextsim/modules/oasis/include -o /opt/local/nextsim/lib/liboasis.so.1.0 /opt/local/nextsim/objs/./oasis_cpp_interface.o /opt/local/nextsim/objs/./oasis_cpp_interface_ftn.o /docker_io/compile_oa3-mct/lib/libpsmile.MPI1.a /docker_io/compile_oa3-mct/lib/libmct.a /docker_io/compile_oa3-mct/lib/libmpeu.a /docker_io/compile_oa3-mct/lib/libscrip.a -fopenmp -Wl,-rpath,/usr/lib/x86_64-linux-gnu/openmpi/lib/ -L /usr/lib/x86_64-linux-gnu/openmpi/lib/ -lmpi_cxx -lmpi -ldl -lstdc++ -lpthread -L /docker_io/compile_oa3-mct/lib -Wl,-rpath,/usr/lib/x86_64-linux-gnu -L /usr/lib/x86_64-linux-gnu -lnetcdff -shared -Wl,-soname,liboasis.so.1

它给出的错误是:

/usr/bin/x86_64-linux-gnu-ld: /docker_io/compile_oa3-mct/lib/libpsmile.MPI1.a(mod_oasis_auxiliary_routines.o): relocation R_X86_64_PC32 against symbol `__mod_oasis_data_MOD_mpi_comm_local' can not be used when making a shared object; recompile with -fPIC
/usr/bin/x86_64-linux-gnu-ld: final link failed: Bad value

如您所见,我们已经使用-fPIC进行了编译(fortran库和c ++对象也是如此)。 我还尝试链接fortran对象而不是库,但是它们还使用其他一些静态库,它们给出了相同的错误。

实际上,由于某种原因,我们的代码在一个特定的服务器上编译,而不是在另一台服务器上,并且不在docker(ubuntu)内部编译,因此问题有些令人困惑。

-fPIC选项在您的命令行中无效:

g++ -std=c++11 -ftemplate-depth-256 -Wno-inline -fPIC -O3 -pthread -fopenmp -v \
-I /usr/lib/x86_64-linux-gnu/openmpi/include/ -I /opt/local/nextsim/modules/oasis/include \
-o /opt/local/nextsim/lib/liboasis.so.1.0 \
/opt/local/nextsim/objs/./oasis_cpp_interface.o \
/opt/local/nextsim/objs/./oasis_cpp_interface_ftn.o \
/docker_io/compile_oa3-mct/lib/libpsmile.MPI1.a \
/docker_io/compile_oa3-mct/lib/libmct.a \
/docker_io/compile_oa3-mct/lib/libmpeu.a \
/docker_io/compile_oa3-mct/lib/libscrip.a \
-fopenmp -Wl,-rpath,/usr/lib/x86_64-linux-gnu/openmpi/lib/ \
-L /usr/lib/x86_64-linux-gnu/openmpi/lib/ \
-lmpi_cxx -lmpi -ldl -lstdc++ -lpthread -L /docker_io/compile_oa3-mct/lib \
-Wl,-rpath,/usr/lib/x86_64-linux-gnu \
-L /usr/lib/x86_64-linux-gnu -lnetcdff \
-shared -Wl,-soname,liboasis.so.1

因为-fPIC编译选项,并且这是一个链接命令。 没有输入源文件。 编译已经完成。 此命令行中的其他编译选项:

std=c++11 -ftemplate-depth-256 -Wno-inline -fopenmp
-I /usr/lib/x86_64-linux-gnu/openmpi/include/ -I /opt/local/nextsim/modules/oasis/include \

也是多余的。

链接器说,对象文件libpsmile.MPI1.a(mod_oasis_auxiliary_routines.o)即成员mod_oasis_auxiliary_routines.o存档的libpsmile.MPI1.a ,未经编译-fPIC 你说:

我们已经使用-fPIC进行了编译(fortran库和c ++对象也是如此)。

但是很有可能在链接器错误的情况下,在libpsmile.MPI1.a中的目标文件的编译中未使用-fPIC

重新编译输入到链接的所有目标文件,包括静态库中的目标文件,确保已启用-fPIC 链接到共享库中的所有对象文件都必须是“位置无关代码”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM