У меня есть Ubuntu 14.04 на 64-разрядной машине. Я хотел бы работать gfortran -m32
для моего f77 кода Фортрана, который также использует библиотеки i386 CERN. Я загрузил пакеты Ubuntu cernlib, lib32gfortran-4.8-dev, и gcc-мультиlib. Но я получил ошибки как это, когда я выполнил свою команду:
$ gfortran -m32 -O -o out10 MBpart1ep0.f -L. -lmathlib -lkernlib -Lcuba
/tmp/ccs5Njbz.o: In function `MAIN__':
MBpart1ep0.f:(.text+0x82): undefined reference to `cuhre_'
//usr/local/lib/libmathlib.a(cgamma64.o): In function `wgamma_':
cgamma64.F:(.text+0xd1): undefined reference to `s_wsfi'
cgamma64.F:(.text+0xe5): undefined reference to `do_fio'
cgamma64.F:(.text+0xea): undefined reference to `e_wsfi'
...
Для наблюдения моей полной ошибки перейдите к моему предыдущему сообщению.
Как кто-то предположил, эти ошибки вызываются несовместимой f2c библиотекой. Таким образом, я нашел, что существует библиотека i386 f2c для Ubuntu 14.04. Как показано ниже, я установил f2c:i386 на своей машине, заменив некоторые предыдущие пакеты. Но затем я получил новые ошибки при выполнении gfortran -m32 ... -lf2c
.
gg@gg-VirtualBox:~$ aptitude search f2c
i A f2c - FORTRAN 77 to C/C++ translator
p f2c:i386 - FORTRAN 77 to C/C++ translator
...
gg@gg-VirtualBox:~$ sudo aptitude install f2c:i386
[sudo] password for gg:
The following NEW packages will be installed:
binutils:i386{ab} cpp:i386{ab} cpp-4.8:i386{ab} f2c:i386{b} gcc:i386{ab}
gcc-4.8:i386{ab} gcc-4.8-base:i386{a} gcc-4.9-base:i386{a}
libasan0:i386{a} libatomic1:i386{a} libc6:i386{a} libc6-dev:i386{a}
libcloog-isl4:i386{a} libf2c2:i386{ab} libf2c2-dev:i386{ab}
libgcc-4.8-dev:i386{a} libgcc1:i386{a} libgmp10:i386{a} libgomp1:i386{a}
libisl10:i386{a} libitm1:i386{a} libmpc3:i386{a} libmpfr4:i386{a}
libquadmath0:i386{a} linux-libc-dev:i386{a} zlib1g:i386{a}
The following packages will be upgraded:
linux-libc-dev
1 packages upgraded, 26 newly installed, 0 to remove and 114 not upgraded.
Need to get 22.5 MB of archives. After unpacking 74.5 MB will be used.
The following packages have unmet dependencies:
libf2c2 : Conflicts: libf2c2:i386 but 20090411-2 is to be installed.
libf2c2:i386 : Conflicts: libf2c2 but 20090411-2 is installed.
cpp-4.8 : Conflicts: cpp-4.8:i386 but 4.8.2-19ubuntu1 is to be installed.
cpp-4.8:i386 : Conflicts: cpp-4.8 but 4.8.2-19ubuntu1 is installed.
binutils : Conflicts: binutils:i386 but 2.24-5ubuntu3 is to be installed.
binutils:i386 : Conflicts: binutils but 2.24-5ubuntu3 is installed.
gcc : Conflicts: gcc:i386 but 4:4.8.2-1ubuntu6 is to be installed.
gcc:i386 : Conflicts: gcc but 4:4.8.2-1ubuntu6 is installed.
cpp : Conflicts: cpp:i386 but 4:4.8.2-1ubuntu6 is to be installed.
cpp:i386 : Conflicts: cpp but 4:4.8.2-1ubuntu6 is installed.
gcc-4.8 : Conflicts: gcc-4.8:i386 but 4.8.2-19ubuntu1 is to be installed.
gcc-4.8:i386 : Conflicts: gcc-4.8 but 4.8.2-19ubuntu1 is installed.
f2c : Conflicts: f2c:i386 but 20100827-1 is to be installed.
f2c:i386 : Conflicts: f2c but 20100827-1 is installed.
libf2c2-dev : Conflicts: libf2c2-dev:i386 but 20090411-2 is to be installed.
libf2c2-dev:i386 : Conflicts: libf2c2-dev but 20090411-2 is installed.
The following actions will resolve these dependencies:
Remove the following packages:
1) f2c
2) fort77
3) libf2c2
4) libf2c2-dev
Keep the following packages at their current version:
5) binutils:i386 [Not Installed]
6) cpp:i386 [Not Installed]
7) cpp-4.8:i386 [Not Installed]
8) gcc:i386 [Not Installed]
9) gcc-4.8:i386 [Not Installed]
Leave the following dependencies unresolved:
10) f2c:i386 recommends gcc:i386
11) libc6-dev:i386 recommends gcc:i386 | c-compiler:i386
Accept this solution? [Y/n/q/?] y
The following NEW packages will be installed:
f2c:i386 gcc-4.9-base:i386{a} libc6:i386{a} libc6-dev:i386{a}
libf2c2:i386{a} libf2c2-dev:i386{a} libgcc1:i386{a}
linux-libc-dev:i386{a}
The following packages will be REMOVED:
f2c{a} fort77{a} libf2c2{a} libf2c2-dev{a}
The following packages will be upgraded:
linux-libc-dev
The following packages are RECOMMENDED but will NOT be installed:
bcc:i386 clang-3.3:i386 clang-3.4:i386 clang-3.5:i386 gcc:i386
gcc-4.4:i386 gcc-4.6:i386 gcc-4.7:i386 gcc-4.8:i386 tcc:i386
1 packages upgraded, 8 newly installed, 4 to remove and 114 not upgraded.
Need to get 7,991 kB of archives. After unpacking 21.9 MB will be used.
Do you want to continue? [Y/n/?] y ...
...
Новые ошибки, теперь используя -lf2c
опция (добавление -lm
не имеет эффекта). Без этой опции ошибки - то же как прежде.
gg@gg-VirtualBox:~/Desktop/myfolder$ gfortran -m32 -O -o out10 MBpart1ep0.f -L. -lmathlib -lkernlib -Lcuba -lf2c
/tmp/cc66Jegn.o: In function `MAIN__':
MBpart1ep0.f:(.text+0x82): undefined reference to `cuhre_'
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../libf2c.so: undefined reference to `MAIN__'
collect2: error: ld returned 1 exit status
Кто-либо знает то, что я могу сделать для решения этой проблемы?
Я добрался MBpart1ep0.f
скомпилировать как amd64 двоичный файл вместо i386, таким образом, это могло бы быть легче.
sudo apt-get install gfortran libmathlib2-dev libcuba3-dev
Я затем скомпилировал с:
gfortran -o out10 MBpart1ep0.f -lmathlib -lcuba
К сожалению, out10
файл segfaults сразу с вызовом к cuhre_
. Смотря на код, проблема, кажется, что cuhre
функция имеет дополнительное userdata
аргумент. Я не знаю достаточно о Фортране, чтобы выяснить, как передать нулевой аргумент туда, но вместо этого я заменил вызов к cuhre
с:
call cuhre(ndim, ncomp, integrand, 0, epsrel, epsabs, flags,
& mineval, maxeval, key, nregions,
& neval, fail, integral, error, prob)
Таким образом, просто добавленный 0
аргумент после integrand
аргумент. Восстановление с этим изменением, это не делает segfault и на самом деле распечатывает результат:
-0.7044994994694501E-01 0.7023304936781998E-05 0.000000000000000
Я действительно не понимаю код, таким образом, я не могу сказать, корректно ли это. Я скажу, что также восстановил в i386 chroot, чтобы видеть, имело ли это какое-либо значение, и мы получили в основном то же значение:
-0.7044994994694533E-01 0.7023304934705608E-05 0.3745918505937418E-16