2013-12-19 2 views
1

Я привык использовать следующий синтаксисПочему мои Fortran функции экспортируются при использовании BIND (C, 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.

+0

Я бы спросил у Форума поддержки Intel. –

+0

Кто-то должен знать что-то здесь. Надеюсь. – ja72

+2

ISO_C_BINDING просто не делает то, что вы надеетесь. Он добавляет несколько предопределенных констант и процедур, которые помогают вам взаимодействовать с C-кодом. Он * не * автоматически экспортирует функции, вы все равно должны использовать атрибут DLLEXPORT. –

ответ

5

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

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

Есть по крайней мере три способа маркировки процедуры таково, что она экспортируется в DLL:

  • запись в файле объект, который содержит процедуру (это как СВЯЗЫВАЕТ DLLEXPORT работает с ifort).
  • записей в разделе ЭКСПОРТ файла определения модуля (.DEF), который передается компоновщику во время соединения.
  • аргументы командной строки самому компоновщику (/ ЭКСПОРТ: xxx).

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

+0

Спасибо за хорошо продуманное объяснение. – ja72