Почему мои фортрановые функции не экспортируются при использовании атрибута BIND(C, NAME="name")

Я привык использовать следующий синтаксис

    subroutine CalcA(A,N)
    !DEC$ ATTRIBUTES DLLEXPORT :: CALCA
    !DEC$ ATTRIBUTES ALIAS:'CalcA' :: CalcA
    IMPLICIT NONE        
    ...
    end subroutine CalcA

которая производит экспортированную функцию в.dll DependencyWalker

Так что теперь я пытаюсь новый ISO_C_BINDING со следующим кодом

    subroutine CalcA(A,N) BIND(C, NAME="CalcA")
    USE, INTRINSIC :: ISO_C_BINDING
    IMPLICIT NONE        
    ...        
    end subroutine CalcA

Но функция экспорта не создана

DependencyWalker

Так чего мне здесь не хватает? Как новый 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).

Что для вас лучше, зависит... некоторые предпочитают иметь исходную документацию об экспорте, другие находят внешний вид и нестандартную природу директив компилятора невыносимо одиозными.

Другие вопросы по тегам