Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fortran 'parameter' type not included in compiled object

I have a Fortran module that contains some variables that have the attribute parameter and some have the attribute save. The parameter ones are not included in the compiled object, which becomes a problem when trying to assemble a library. For example, consider a file testModule.f90:

module testMOD
  integer, save :: thisIsSaved = 1
  integer, parameter :: thisIsParametered = 2
end module testMOD

I compile this with: ifort -c testModule.f90. When I check what's inside it:

>$ nm testModule.o
0000000000000000 T testmod._
0000000000000000 D testmod_mp_thisissaved_

only the thisIsSaved variable is there. I know that I can just change thisIsParametered to save rather than parameter but, ideally, I'd like to prevent a linking user from changing this value. Is there a way to do this?

Edit: I'd like this library to be accessible to C codes, as well, not just Fortran.

like image 876
Eli Lansey Avatar asked Feb 18 '23 15:02

Eli Lansey


1 Answers

That should actually be stored in the .mod file. All of the data types and function prototypes are stored there which is why you need to include it when you send someone a .lib file. Try linking in the module after using it in something else and it should work just fine.

Essentially the .mod file serves the same purpose as the .h file in c, so of course you are going to have to include it with your library.

[update:] If you are attempting to use this in C, then as you said, there is no means for you to easily maintain the named constant. As an alternative, you can use the protected attribute on the entity. At least with Fortran, anything outside of the module is restricted from writing to the variable. I don't know if the C compiler and the linker will respect this behavior, but I think this is probably your best shot.

module testMOD
 INTEGER, PROTECTED, BIND(C)  :: globalvar = 1
end module testMOD

Unfortunately I don't really do much with interoperability with C, so I can't really guarantee that C will respect the protected attribute and not allow the variable to be changed.

like image 135
Davron Avatar answered Mar 15 '23 03:03

Davron