c ++: создание общего объекта из статической библиотеки - PullRequest
0 голосов
/ 15 января 2019

мы пытаемся создать библиотеку разделяемых объектов c ++ для взаимодействия со статической библиотекой fortran (скомпилированной с mpif90). Существует один файл-оболочка fortran, скомпилированный с помощью gfortran или mpif90 (оба сбойны) и один файл-оболочка c ++, скомпилированный с помощью g ++

Команда компиляции:

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), поэтому проблема немного озадачивает.

1 Ответ

0 голосов
/ 15 января 2019

Параметр -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.

...