Параметр -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
- это опция компиляции , а это команда linkage . Нет исходных файлов
вход. Компиляция уже сделана. Другие параметры компиляции в этой командной строке:
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 ++).
но более вероятно, что -fPIC
не использовался при компиляции
объектные файлы в libpsmile.MPI1.a
чем то, что компоновщик ошибается.
Перекомпилируйте все входные файлы объектных файлов, в том числе в статических библиотеках, убедившись, что -fPIC
включен. Все объектные файлы, связанные с общей библиотекой, должны иметь Position-Independent-Code.