[FORTRAN,WIN]объявление функции из дллки & вопрос про Intel Compiler
Попробуй использовать interface - в компаковском и интеловском хелпе по нему даже вроде бы написано про внешние длл (в Бартеньеве точно было).
Другой вопрос... Поставил Intel Fortran 7.1, пишу некий код, что-то типа:
module rcrtкомпилится нормально, а при линковке получаю:
use dfwinty
use kernel32
integer(HANDLEprivate :: CHandle
contains
subroutine InitCrt
CHandle = GetStdHandle(STD_INPUT_HANDLE)
end subroutine
end module
RCRT.obj : error LNK2001: unresolved external symbol _GETSTDHANDLE
Аналогично с функцией Beep
Если использовать Compaq Visual Fortran, то всё нормально линкуется. Это как-то лечится?
Если использовать Compaq Visual Fortran, то всё нормально линкуется.
У компаковского и интеловского фортрана не все библиотеки называются одинаково и имеют одинаковую функциональность (например компаковский dflib - более менее соответствует интеловскому iflib)
![](/images/graemlins/frown.gif)
RCRT.obj : error LNK2001: unresolved external symbol _GETSTDHANDLE
То есть если твоя GETSTDHANDLE описана в use dfwinty - попробуй вместо dfwinty использовать ifwinty (здесь у меня фортрана нет, но наверняка должна быть либа с аналогичной функциональностью).
Вот такая вот совместимость у интеловского фортрана с компаковским
![](/images/graemlins/frown.gif)
п.с.:
Есть еще такой вариант - можно скопировать компаковскую библиотеку в папку интеловских библиотек (там вроде бы еще файл с описанием нужно малость подправить по аналогии). Но по понятным причинам это не работает для 64-х битного компилятора.
В компаковском фортране - тоже самое
INTERFACE
FUNCTION GetStdHandle( &
nStdHandle)
USE DFWINTY
integer(HANDLE) :: GetStdHandle ! HANDLE
!MS$ ATTRIBUTES STDCALL, ALIAS:'_Ge4' :: GetStdHandle
integer(DWORD) nStdHandle ! DWORD nStdHandle
END FUNCTION
END INTERFACE
Кстати, в обоих файлах есть use dfwinty
interface !lib=kernel32.lib
integer(4) function GetStdHandle (nStdHandle)
!DEC$ ATTRIBUTES DEFAULT :: GetStdHandle
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS : '_Ge4' :: GetStdHandle
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS : 'GetStdHandle' :: GetStdHandle
!DEC$ ENDIF
integer nStdHandle
end function GetStdHandle
end interface
И еще одно. другие функции из того-же kernel32 нормально линкуются. Например, SetConsoleCursorPosition, FillConsoleOutputCharacter, etc.
А то мб в C:\Program Files\Intel\Compiler70\IA32\Include\KERNEL32.F90 ошибка - забыли исправить?..
Еще можно попробовать
INTERFACEявно прописать в своей либе.
FUNCTION GetStdHandle( &
nStdHandle)
USE DFWINTY
integer(HANDLE) :: GetStdHandle ! HANDLE
!MS$ ATTRIBUTES STDCALL, ALIAS:'_Ge4' :: GetStdHandle
integer(DWORD) nStdHandle ! DWORD nStdHandle
END FUNCTION
END INTERFACE
Еще такое соображение - integer по умолчанию в интеловском и компаковском проектах точно одинаковой размерности?
Еще такое соображение - integer по умолчанию в интеловском и компаковском проектах точно одинаковой размерности?ну размерность задаётся тем, что в описании винапишных функций BOOL и DWORD имеют размер 4 байта, просто так принято.
Да, в обеих папках include имеется dfwinty.f90 (разных размеров, правда а ifwinty.f90 вообще отсутствует.
А вот явное прописывание помогло, спасибо.
Но, вообще говоря, какой-то странный глюк.
Насчет глюка - мне вообще фортран показался несколько глючным (и компаковский, и интеловский)
![](/images/graemlins/frown.gif)
Точнее так: есть некоторый "путь фортрана" - пока ему следуешь - все нормально - стоит немного сойти - на ровном месте могут глюки появиться
![](/images/graemlins/frown.gif)
Т.е., у меня есть процедура
subroutine GotoXY(X,Y)
integer(WORD intent(IN) :: X,Y
...
end subroutine
При этом компилятор ругается на вызов GotoXY(1,1 приходится писать GotoXY(1_2,1_2)
![](/images/graemlins/frown.gif)
Если объявить результат функции real*4, а в другую нужно real*8, например, линковщик будет ругаться
![](/images/graemlins/frown.gif)
Оставить комментарий
Andbar
Как правильно объявлять функции из самописной dllки?Смотрел стандартные заголовки у интеловского фортрана, там никакого упоминания о dll-ках нет, просто описания функций с указанием их имени в dll, а также ссылки на lib-файл. Вот только lib-файла в моём случае нет.
зы: в поисковике наиболее обещающие ссылки указывают на описания из книжных магазинов