Почему мои фортрановые функции не экспортируются при использовании атрибута BIND(C, NAME="name")
Я привык использовать следующий синтаксис
subroutine CalcA(A,N)
!DEC$ ATTRIBUTES DLLEXPORT :: CALCA
!DEC$ ATTRIBUTES ALIAS:'CalcA' :: CalcA
IMPLICIT NONE
...
end subroutine CalcA
которая производит экспортированную функцию в.dll
Так что теперь я пытаюсь новый ISO_C_BINDING
со следующим кодом
subroutine CalcA(A,N) BIND(C, NAME="CalcA")
USE, INTRINSIC :: ISO_C_BINDING
IMPLICIT NONE
...
end subroutine CalcA
Но функция экспорта не создана
Так чего мне здесь не хватает? Как новый iso_c_binding
собирается заменить устаревший !DEC$ ATTRIBUTE DLLEXPORT
декларации?
PS. Я на Intel Fortran XE 2013 на платформе Win7-64 через VS2010.
1 ответ
Как предполагает Ганс, процедура не была экспортирована, поскольку компоновщику не было предложено ее экспортировать.
Метка привязки в предложении BIND (модуль ISO_C_BINDING не имеет отношения к обсуждению) практически устанавливает "имя компоновщика" процедуры (аналогично тому, как это делает ATTRIBUTES ALIAS) и делает это таким образом, чтобы это соответствовало C. BIND Предложение также устанавливает соглашение о вызовах, чтобы быть C-совместимым (аналогично ATTRIBUTES C). Коллективный эффект предложения BIND также включает в себя эффект ATTRIBUTES DECORATE (и могут быть другие тонкие различия между атрибутами директивы коллективного компилятора и предложением, которое я не рассматривал).
Существует как минимум три способа пометить процедуру, чтобы она экспортировалась в DLL:
- записи в объектном файле, который содержит процедуру (именно так ATTRIBUTES DLLEXPORT работает с ifort).
- записи в разделе EXPORTS файла определения модуля (.DEF), который передается компоновщику во время компоновки.
- Аргументы команды link для самого компоновщика (/EXPORT:xxx).
Что для вас лучше, зависит... некоторые предпочитают иметь исходную документацию об экспорте, другие находят внешний вид и нестандартную природу директив компилятора невыносимо одиозными.