Use fgsl in fortran: how to compile with gfortran

空扰寡人 提交于 2021-01-29 20:55:35

问题


I am trying to do something basic, but I can't find the relevant information on how to compile. I tried the following without success:

gfortran testintegral.f90 -lgsl -lgslcblas
testintegral.f90:19.6:
  use fgsl
      1
Fatal Error: Can't open module file 'fgsl.mod' for reading at (1): No such file 

The file is taken from http://de.wikibooks.org/wiki/Fortran:_FGSL#Beispiel:_Numerische_Integration (page in german but readily understandable) so I suppose it is OK.

Maybe the syntax of the compilation command is incorrect ?


EDIT:

I edit my initial post so as not to bury important information in the comments.

Those are the paths of the libraries:

sudo find -name '*libgsl.so*'
./usr/lib/libgsl.so.0
./usr/lib/libgsl.so.0.17.0
sudo find -name '*libgslcblas.so*'
./usr/lib/libgslcblas.so.0
./usr/lib/libgslcblas.so.0.0.0

But I still got an error message when doing:

gfortran testintegral.f90 -L/usr/lib -I/usr/include/fgsl -lfgsl -lgsl -lgslcblas
/usr/bin/ld: cannot find -lgsl
/usr/bin/ld: cannot find -lgslcblas
collect2: error: ld returned 1 exit status

回答1:


Use the -I flag. For example,

gfortran -I/usr/local/fgsl/include testintegral.f90 -lgsl -lgslcblas

All the .mod files in that directory are then included.

EDIT: See also comments below.




回答2:


Compilation of a file containing modules in gfortran produces two file types: The source file foo.f90 is translated into foo.o. If foo.f90 contains the modules bar and baz, then bar.mod and baz.mod are also generated. They contain the interface information for these modules. Note that there is no required mapping between module and file names (although programming guildelines may require this).

When the statement use fsgl is found, the interface information is read from fsgl.mod. If that file is not found, you get the error message

Can't open module file 'fgsl.mod' for reading at (1): No such file

So, you have to change your order of compilation (possibly through changing a Makefile).




回答3:


1) the easiest way is

gfortran testintegral.f90 -I/usr/local/include/fgsl -lfgsl

2) this also works

gfortran -I/usr/local/include/fgsl testintegral.f90 -lgsl -lgslcblas -lm

3) I read the log of the make check in the package, the developer used such a way

gfortran -I/usr/local/include/fgsl -g -O2 -c -o test.o testintegral.f90
/bin/bash /path/.../fgsl-1.3.0/libtool  --tag=FC   --mode=link gfortran -g -O2   -o test test.o /usr/local/lib/libfgsl.la -lgsl -lgslcblas -lm 

UPDATE:

First check the linkers for fgsl

pkg-config --libs fgsl

probably will get something like this

-L/usr/local/lib -lfgsl -lgsl -lgslcblas -lm

Then you put the linkers, works for all the cases!

gfortran -I/usr/include/fgsl example.f90 -lfgsl -lgsl -lgslcblas -lm

UPDATE: I answered too soon, here is the best universal method I found:

gfortran `pkg-config --cflags fgsl` testintegral.f90 -o integral `pkg-config --libs fgsl`


来源:https://stackoverflow.com/questions/29304328/use-fgsl-in-fortran-how-to-compile-with-gfortran

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!