Почему мои функции fortran не экспортируются при использовании атрибута 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.


person John Alexiou    schedule 19.12.2013    source источник
comment
Я бы спросил на форуме поддержки Intel.   -  person Vladimir F    schedule 19.12.2013
comment
Тут кто-то должен что-то знать.. Надеюсь.   -  person John Alexiou    schedule 19.12.2013
comment
ISO_C_BINDING просто не делает того, на что вы надеетесь. Он добавляет несколько предопределенных констант и процедур, которые помогают вам взаимодействовать с кодом C. Он не автоматически экспортирует функции, вы все равно должны использовать атрибут DLLEXPORT.   -  person Hans Passant    schedule 19.12.2013
comment
Я понимаю. Поместите это в ответ, и я награжу его. Спасибо.   -  person John Alexiou    schedule 19.12.2013
comment
Я не говорил, что никто не узнает, я просто сказал, что спрошу на официальном форуме поддержки производителя, не более того. Иначе зачем платить за поддержку?   -  person Vladimir F    schedule 20.12.2013
comment
Что это за утилита, которая анализирует DLL?   -  person bdforbes    schedule 21.12.2013
comment
Я использую Dependency Walker из инструментов VS.   -  person John Alexiou    schedule 21.12.2013


Ответы (1)


Как предполагает Ганс, процедура не была экспортирована, потому что компоновщика не попросили экспортировать ее.

Метка привязки в предложении BIND (модуль ISO_C_BINDING не имеет отношения к обсуждению) практически устанавливает «имя компоновщика» процедуры (аналогично тому, что делает ATTRIBUTES ALIAS) и делает это способом, совместимым с C. Предложение также устанавливает соглашение о вызовах как совместимое с C (аналогично ATTRIBUTES C). Коллективный эффект предложения BIND также включает действие ATTRIBUTES DECORATE (и могут быть другие тонкие различия между коллективными атрибутами директивы компилятора и предложением, которые я не рассматривал).

Существует как минимум три способа пометить процедуру так, чтобы она экспортировалась в DLL:

  • записи в объектном файле, содержащем процедуру (именно так ATTRIBUTES DLLEXPORT работает с ifort).
  • записи в разделе EXPORTS файла определения модуля (.DEF), который передается компоновщику во время компоновки.
  • аргументы командной ссылки на сам компоновщик (/EXPORT:xxx).

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

person IanH    schedule 20.12.2013
comment
Спасибо за продуманное объяснение. - person John Alexiou; 20.12.2013