[英]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.