Ошибка связывания в gfortran с devtoolset-6
У меня есть система с CentOS 6.4, и она поставляется с GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18).
Я делаю расчет точности в четыре раза, и для этого я установил devtoolset-6 без проблем. Поскольку в системе установлен gcc / gfortran по умолчанию, я очистил оболочку с помощью
env -i bash
и после этого я установил среду devtoolset-6
scl enable devtoolset-6 bash
Если я проверю установленную версию gcc и gfortran, они выглядят следующим образом
gcc (GCC) 6.3.1 20170216 (Red Hat 6.3.1-3)
GNU Fortran (GCC) 6.3.1 20170216 (Red Hat 6.3.1-3)
Все идет нормально. У меня также есть пример тестирования, приведенный ниже
implicit double precision(a-h,o-z)
print * , ' i:'
read(5,*) i
if(i.le.0) stop
a=i
b=sqrt(a)
print * , b
c=b*b
print * , c
end
составлено с
gfortran -fdefault-real-8 -o test.exe test.F
Когда я пытаюсь скомпилировать, я получаю следующую ошибку
(.text+0x20): неопределенная ссылка на
main' /tmp/cc7n6vIv.o: In function
ljacoeff_':test.F:(.text+0xf0): неопределенная ссылка на_gfortran_transfer_real128_write' test.F:(.text+0x16b): undefined reference to
_gfortran_transfer_complex128_write' test.F:(.text+0x1ea): неопределенная ссылка на `_gfortran_transfer_complex128_write' collect2: ошибка: ld вернул 1 состояние выхода
Сначала я подумал, что функция _gfortran_transfer_real128_write не определена, и проверил, что библиотека поставляется с devtoolset-6 с помощью команды по умолчанию "nm", и эта функция определена в libgfortran.a. После некоторой отладки и дополнительной отладки я обнаружил опцию "-v" и перекомпилировал код, а затем заметил, что что-то сбивает с толку, похоже, что ld проверяет старые библиотеки системы вместо той, что поставляется с devtoolset-6. LIBRARY_PATH включает в себя папку /usr/lib/../lib64/, и это вызывает ошибку. В любом случае, если компоновщик не может найти эти функции, он также должен проверить библиотеки devtoolset-6. Похоже, этого не происходит. Как я могу решить эту ошибку связывания?
Вождение: gfortran -v -fdefault-real-8 -o test.exe test.F -l gfortran -l m -shared-libgcc Использование встроенных спецификаций. COLLECT_GCC=gfortran COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/lto-wrapper Цель: x86_64-redhat-linux Настройка с помощью: ../configure --enable-bootstrap --enable-languages =c, C++, fortran, lto --prefix = / opt / rh / devtoolset-6 / root / usr --mandir = / opt / rh / devtoolset-6 / root / usr / share / man --infodir = / opt / rh / devtoolset-6 / root / usr / share / info --with-bugurl = http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads = posix --enable-check =release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-plugin --with-linker-hash-style=gnu --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-совместимый --with-isl=/builddir/build/BUILD/gcc-6.3.1-20170216/obj-x86_64-redhat-linux/isl-install --enable-libmpx --with-mpc=/builddir/build/BUILD/gcc-6.3.1-20170216/obj-x86_64-redhat-linux/mpc-install --with-tune= универсальный --with-arch_32=i686 --build=x86_64-redhat-linux Модель потока: posix gcc версии 6.3.1 20170216 (Red Hat 6.3.1-3) (GCC) COLLECT_GCC_OPTIONS='-v' '-fdefault-real-8' '-o' 'test.exe' '-shared-libgcc' '-mtune= универсальный ' '-march=x86-64' /opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/f951 test.F -fixed-form -cpp=/tmp/ccjQiTpi.f90 -quiet -v test.F -quiet -dumpbase test.F -mtune=generic -march=x86-64 -auxbase test -version -fdefault-real-8 -fintrinsic-modules-path /opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/finclude -o /tmp/cceJeO1o.s GNU Fortran (GCC) версия 6.3.1 20170216 (Red Hat 6.3.1-3) (x86_64-redhat-linux), скомпилированная GNU C версии 6.3.1 20170216 (Red Hat 6.3.1-3), GMP версия 4.3.1, MPFR версия 2.4.1, MPC версии 0.8.1, isl версии 0.14 или 0.13 эвристики GGC: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 игнорирование несуществующего каталога "/opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/include-fixed"игнорирование несуществующего каталога"/opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../../x86_64-redhat-linux/ включает поиск " #include "..." начинается здесь: #include <...> поиск начинается здесь: /opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/finclude /opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/include /usr/local/include /opt/rh/devtoolset-6/root/usr/include /usr/include конец списка поиска. GNU Fortran2008 (GCC) версия 6.3.1 20170216 (Red Hat 6.3.1-3) (x86_64-redhat-linux), скомпилированная GNU C версии 6.3.1 20170216 (Red Hat 6.3.1-3), GMP версия 4.3.1, MPFR версия 2.4.1, MPC версия 0.8.1, isl версия 0.14 или 0.13 Эвристика GGC: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 COLLECT_GCC_OPTIONS='-v' '-fdefault-real-8' '-o' 'test.exe' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/as -v --64 -o /tmp/cc7n6vIv.o /tmp/cceJeO1o.s GNU-ассемблер версии 2.27 (x86_64-redhat-linux) с использованием BFD версии 2.27-8.el6 Чтение спецификаций из /opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/libgfortran.spec переименование спецификации lib в liborig COLLECT_GCC_OPTIONS='-v' '-fdefault-real-8' '-o' 'test.exe' '-shared-libgcc' '-mtune=generic' '-march=x86-64' COMPILER_PATH=/opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/:/opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/:/opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/:/opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/:/opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/ LIBRARY_PATH=/opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat- Linux / 6.3.1 /: / OPT / Rh / devtoolset-6 / корень / USR / Библиотека / GCC / x86_64-RedHat-Linux/6.3.1/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/: /opt/rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-v' '-fdefault-real-8' '-o' 'test.exe' '-shared-libgcc' '-mtune=generic' '-march=x86-64' /opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/collect2 -plugin /opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/liblto_plugin.so -plugin-opt=/opt/rh/devtoolset-6/root/usr/libexec/gcc/x86_64-redhat-linux/6.3.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccQAAlqC.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lquadmath -plugin-opt=-pass-through=-lm -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --no-add-required -eh-frame-hdr --hash-style = gnu -m elf_x86_64 - динамический компоновщик /lib64/ld-linux-x86-64.so.2 -o test.exe /usr/lib/../lib64/crt1.o /usr/lib/../lib64/crti.o / opt /rh/devtoolset-6/root/usr/lib/gcc/x86_64-redhat-linux/6.3.1/crtbegin.o -L / opt / rh / devtoolset-6 / root / usr / lib / gcc / x86_64-redhat -linux / 6.3.1 -L / opt / rh / devtoolset-6 / root / usr / lib / gcc / x86_64-redhat-linux / 6.3.1 /../../../../ lib64 -L /lib/../lib64 -L / usr / lib /../ lib64 -L / opt / rh / devtoolset-6 / root / usr / lib / gcc / x86_64-redhat-linux / 6.3.1 /../../.. /tmp/cc7n6vIv.o -lgfortran -lm -lgcc_s -lgcc -lquadmath -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc / opt / rh / devtoolset-6 / root / usr / lib / gcc / x86_64-redhat-linux / 6.3.1 / crtend.o /usr/lib/../lib64/crtn.o /usr/lib/../lib64/crt1.o: в функции
_start': (.text+0x20): undefined reference to
main '/tmp/cc7n6vIv.o: в функцииljacoeff_': test.F:(.text+0xf0): undefined reference to
_gfortran_transfer_real128_write' test.F:(.text+0x16b): неопределенная ссылка на_gfortran_transfer_complex128_write' test.F:(.text+0x1ea): undefined reference to
_gfortran_transfer_complex128_write' collect2: error: ld вернул 1 состояние выхода