не удалось найти точку входа Fortran Dll

Продолжая последний нерешенный вопрос о dll, я попытался создать fortran dll с помощью g95 с помощью следующих команд:

g95 -c FCall.f90

g95 -shared -mrtd -o FCall.dll FCall.o

Когда я связал его с VB, он показывает: «Невозможно найти точку входа с именем FortranCall в DLL «C:\Users\Hp\Documents\Visual Studio 2010\Projects\WindowsApplication5\WindowsApplication5\FCall.dll».

Вот код FORTRAN:

  SUBROUTINE FortranCall (r1, num)

 !DEC$ ATTRIBUTES DLLEXPORT :: FortranCall

 !DEC$ ATTRIBUTES ALIAS:'FortranCall' :: FortranCall

   REAL,INTENT(IN) :: r1          
   REAL,INTENT(OUT) :: num

   num = MOD (r1, 256.0)

 END SUBROUTINE

Вот код ВБ:

   Private Sub Command1_Click()

   r1 = 456.78

   Call FortranCall(r1, Num)

   Text1.Text = Str$(Num)

   End Sub

Код модуля в VB:

Declare Sub FortranCall Lib"C:\Users\Hp\Documents\Visual Studio 2010\Projects\WindowsApplication5\WindowsApplication5\FCall.dll" (r1 As Single, Num As Single)

Есть ли у G95 собственный оператор экспорта для функции экспорта из dll? в этой подпрограмме атрибут экспорта (!DEC$ ATTRIBUTES DLLEXPORT::FortranCall) использовался в визуальном фортране.


person Andra W    schedule 06.08.2014    source источник
comment
Пожалуйста, попробуйте узнать, как использовать форматирование в поле редактирования. Мы поможем вам с остальным, но по крайней мере попробовать что-то.   -  person Vladimir F    schedule 06.08.2014
comment
Хорошо, или просто узнайте, что всегда есть кто-то, кто так отчаянно хочет +2 от редактирования (@Blubberguy22), что он всегда сделает это за вас.   -  person Vladimir F    schedule 06.08.2014
comment
Спасибо, извините, я до сих пор не понимаю, как использовать форматирование в поле редактирования. Но я узнаю и использую это для следующего вопроса. Спасибо Серджио за редактирование.   -  person Andra W    schedule 06.08.2014


Ответы (1)


Директивы, которые вы используете, очень специфичны для компилятора. Даже название говорит о том, что оно специфично для компилятора DEC (и потомков — Compaq и Intel).

У гфортрана тоже самое, но с !$GCC, а не с G95.

Я настоятельно рекомендую вам использовать функцию Fortran 2003 bind(C,name="name") вместо того, чтобы устанавливать имя символа. См. также тег https://stackoverflow.com/questions/tagged/fortran-iso-c-binding< /а>.

 SUBROUTINE FortranCall (r1, num) bind(C,name="FortranCall")

 !DEC$ ATTRIBUTES DLLEXPORT :: FortranCall

 END SUBROUTINE

И GCC, и G95 экспортируют символы по умолчанию, поэтому директива dllexport не нужна, но оставьте ее для Intel Fortran.

В качестве альтернативы вы можете попробовать вариант -fno-underscoring, но он опять же специфичен для g95 и не будет работать с другими компиляторами.

person Vladimir F    schedule 06.08.2014
comment
Простите за поздний ответ. Я создал dll, используя указанную выше директиву. Я также пытался создать dll с помощью Intel Visual Fortran и Visual Studio 2008. Но когда VB вызывает функцию, оба метода показывают следующее сообщение об ошибке: Попытка чтения или записи защищенной памяти. Часто это указывает на то, что другая память повреждена. Я понятия не имею, как решить эту проблему. У Вас есть какие-то предложения? Спасибо - person Andra W; 14.08.2014
comment
Это слишком мало информации, чтобы что-то диагностировать. Я не знаю VB, но попробуйте добавить ByRef к подпрототипу. - person Vladimir F; 14.08.2014
comment
Спасибо. Это работает в VB 2008, но в vb 2010 все еще есть проблема. - person Andra W; 16.08.2014
comment
Вероятно, начнем новый вопрос, я думаю, что первоначальная проблема решена. Я не могу помочь вам больше. И включить какой-то осмысленный дескриптон, тут проблема ни о чем не говорит. - person Vladimir F; 16.08.2014
comment
В порядке. На данный момент я думаю, что этого достаточно для моей проектной работы с VB 2008. Я думал, что ошибка в VB 2010 создаст более широкую проблему. Итак, я должен задать новый вопрос. - person Andra W; 17.08.2014