Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
공지
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.
29281 토론

!DEC$ ATTRIBUTES Compiler dependent or independent ?

bjoern_
초급자
762 조회수

Hello,

I have another question which maybe seems to be really stupid to you. But because I have not much experince with Fortran and a google search as well as a search here could not answer my question I have to start this thread.

Are the !DEC$ATTRIBUTES "directives" compilerindependent or not ?

Because my program should be compiler independent so I have to use "directives" whichare supportedby everycompiler.

0 포인트
4 응답
Jugoslav_Dujic
소중한 기여자 II
762 조회수
!DEC$ directives are supported only in the descendents of DEC compilers, i.e. Intel and Compaq Visual Fortrans and their VAX and Linux brethren.

The actual Fortran 2003 standard introduced few concepts which should enhance portability; the most important are VALUE attribute and ISO_C_BINDING module, used for interfacing with C and compatible languages. ISO_C_BINDING covers most of !DEC$ATTRIBUTES semantics, as well as C pointer (de)referencing (supplement for non-portable "Cray" pointers). However, those are not yet implemented in IVF :-(. I'm not sure about the exact list, but I think g95 and IBM's XLF did implement it (maybe also Lahey).

So, there's lot to be desired in this field... As a solace, !DEC$ directives are ignored by other compilers, so you might get away by other means.
0 포인트
bjoern_
초급자
762 조회수

Thanks.

So when I understand you right, than the way to call DLL routines for example differs fromcompilerto compiler.

I will refer to my other thread.Which is aboutcalling routines in a C++ DLL from a Fortran main. There I have a interface like this

interface

subroutine asdf()

!DEC$ATTRIBUTES C, DLLIMPORT, ALIAS: "_asdf" :: asdf

end subroutine asdf

end interface

So when I want to compile it with CVF or IVF than the code is correct, but when I try to build it with another compiler than it might not work.

0 포인트
bjoern_
초급자
762 조회수

hmm no answers :-/

So then I willask my question in other words.

Is it possible to useroutines fromDLLs without the !DEC$ATTRIBUTES command ?

0 포인트
Jugoslav_Dujic
소중한 기여자 II
762 조회수
DLLIMPORT is actually spurious; it does (almost) nothing so you should be able to get by without it (try it yourself).

What is compiler-dependent are calling conventions (cdecl/stdcall), external name mangling (uppercase/lowercase, trailing/leading underscore), means to pass character arguments etc. Note that people do get by interfacing with C even with compilers without semantic equivalents of !DEC$ATTRIBUTES; there are limitations though. For example, there is no language-defined way to call a C procedure with a CamelCase name, or with STDCALL calling convention. Fortunately, IVF defaults match those of most other compilers (CVF's didn't).

As for e.g. DLLEXPORT, it can also be worked around by supplying a .def file with the contents:

EXPORTS
_MyFortranRoutine=_MYFORTRANROUTINE
_MyOtherRoutine=_MYOTHERROUTINE

and including it into the project (it will be given to the linker). It will export symbols "_MyFortranRoutine" etc. which can be referenced from C as

extern "C" void MyFortranRoutine(...)

I think that a similar trick can be performed in reverse direction, i.e. with calling C dlls routines in lowercase or mixed-case (create a .lib file from .def file (instead of using one generated by C compiler ) using LIB command-line tool, then insert that lib file into the Fortran project). Didn't do that myself though. That avoids the need for ALIAS attribute.

See:
http://msdn2.microsoft.com/en-us/library/d91k01sh.aspx

http://msdn2.microsoft.com/en-us/library/f0z8kac4.aspx
0 포인트
응답