在fortran中使用fgsl:如何使用gfortran进行编译

时间:2015-03-27 15:26:14

标签: compilation fortran

我正在尝试做一些基本的,但我找不到有关如何编译的相关信息。我尝试了以下但没有成功:

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 

该文件取自http://de.wikibooks.org/wiki/Fortran:_FGSL#Beispiel:_Numerische_Integration(德文页面,但很容易理解),所以我认为没问题。

编译命令的语法可能不正确吗?


编辑:

我编辑我的初始帖子,以免在评论中隐藏重要信息。

这些是图书馆的路径:

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

但是我在执行操作时仍然收到错误消息:

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

3 个答案:

答案 0 :(得分:2)

使用-I标志。例如,

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

然后包含该目录中的所有.mod文件。

编辑:另见下面的评论。

答案 1 :(得分:0)

在gfortran中编译包含模块的文件会产生两种文件类型:源文件foo.f90被翻译为foo.o。如果foo.f90包含模块barbaz,则还会生成bar.modbaz.mod。它们包含这些模块的接口信息。请注意,模块和文件名之间没有必需的映射(尽管编程guildelines可能需要这样做)。

找到语句use fsgl后,将从fsgl.mod读取接口信息。如果找不到该文件,则会收到错误消息

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

因此,您必须更改编译顺序(可能通过更改Makefile)。

答案 2 :(得分:0)

1)最简单的方法是

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

2)这也有效

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

3)我阅读了软件包中make check的日志,开发人员使用了这种方式

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 

更新:

首先检查fgsl的链接器

pkg-config --libs fgsl

大概会得到这样的东西

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

然后,您放置链接器,适用于所有情况!

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

更新:我回答太早了,这是我找到的最好的通用方法:

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