2015-07-02 4 views
2

У меня есть функции blas/lapack, которые я получил с веб-сайта NETLIB. Я хотел бы включить эти функции в модуль Fortran. Остальная часть моего кода в Fortran 90. Так что я идти об этом:Модули и устаревшие коды Fortran 77

module modname 
contains 


double precision function ddot(n,dx,incx,dy,incy) 
. 
. 
. 
end function 


subroutine dpofa(a,lda,n,info) 
. 
. 
     double precision ddot 
. 
end subroutine dopfa 
end module 

Когда я компилирую с помощью

gfortran modname.f90 

Я получаю следующее сообщение об ошибке:

/tmp/ccC2EUFj.o: In function __temp_MOD_dpofa': temp.f90:(.text+0x11c): undefined reference to ddot_'

Я игнорируя ошибку около Undefined reference to main, я понимаю, что это происходит, потому что у меня нет программных программных программ в файле.

Если, однако, я удаляю строки с module modname, contains и end module компилятор компилируется без каких-либо проблем.

В чем может быть проблема?

+0

Вы должны сообщить gfortran о связи с математическими библиотеками, например: '-llapack -lblas' –

+0

У меня есть исходный код в модуле. Я не понимаю, зачем мне связываться с lapack/blas – mod0

ответ

3

В своем немодульном подходе у вас много внешних функций и подпрограмм. То есть, если они определены вне модуля, то одна процедура не имеет понятия о другом. Вы указываете подпрограмму dpofa о функции ddot с использованием заявления о декларации double precision ddot. Компилятор управляет этим именем до ddot_ (см. Другие подробности), а также управляет именем реальной функции, которую вы имеете к тому же. При необходимости компоновщик разрешает один символ другому.

Когда вы приходите к использованию модуля, у вас все еще есть это объявление внешней функции, но теперь реальная функция у вас в том же модуле больше не является внешней. Вместо этого есть процедура модуля, которая получает искаженное что-то вроде __temp_MOD_ddot. Вы больше не создаете функцию с искаженным именем ddot_.

Предположительно у вас есть ссылка на функцию ddot в dpofa, но в версии модуля, которая будет обозначаться символом ddot_, который не определен.

Вы хотите удалить декларации функций для тех функций, которые теперь определены в том же модуле и больше не являются внешними.

+0

Спасибо! Это сработало. – mod0

Смежные вопросы