Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compilation 在fortran中使用fgsl:如何使用gfortran编译_Compilation_Fortran - Fatal编程技术网

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

Compilation 在fortran中使用fgsl:如何使用gfortran编译,compilation,fortran,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 该文件取自(德语版,但易于理解),因此我认为它是可以理解的 可能编译命

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

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 
该文件取自(德语版,但易于理解),因此我认为它是可以理解的

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


编辑:

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

这些是库的路径:

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

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

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

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

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

使用
-I
标志。比如说,

gfortran -I/usr/local/fgsl/include testintegral.f90 -lgsl -lgslcblas
然后包含该目录中的所有.mod文件

编辑:另请参见下面的注释。

1)最简单的方法是

gfortran testintegral.f90 -I/usr/local/include/fgsl -lfgsl
2) 这同样有效

gfortran -I/usr/local/include/fgsl testintegral.f90 -lgsl -lgslcblas -lm
3) 我看了包中的
makecheck
日志,开发人员就是这样做的

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`

亲爱的@tkoenig谢谢!但我甚至不使用Makefile,它实际上是基本的。我将如何在命令行中执行您的建议?fgsl是Fortran GNU科学库,我通过repo安装了它,所以我的计算机上有这些库。英文页:。您是如何安装fgsl的?我使用了从源代码中选择的例程,在这种情况下,我只是直接用gfortran编译。如果另一种方法安装了库,则必须确保包含链接器选项
l
,或者
l
。并且可能
I
为模块文件指定目录。与您提到的页面完全相同:
deb[arch=amd64] http://lvserver.ugent.be/apt/ubuntu 在我的源代码中可靠稳定。列表在
-lgsl
之前,可能还需要一个
-lfgsl
来根据FGSL接口例程进行构建。使用
查找
我找到了(!)我的lfgsl模块将位于
/usr/include/fgsl
中,而不是
/usr/local/fgsl/include
。但是我有以下问题:
/usr/bin/ld:cannot find-lgsl/usr/bin/ld:cannot find-lgslcblas collect2:error:ld returned 1退出状态
使用
-L
标志指定库的位置。例如
gfortran-L/usr/gsl/lib-L/usr/fgsl/lib…
。我仍然有同样的问题:
gfortran-L/usr/lib-I/usr/include/fgsl testintegral.f90-lfgsl-lgsl-lgslcblas
。我得到
/usr/bin/ld:cannot find-libgsl/usr/bin/ld:cannot find-lgslcblas collect2:error:ld返回了1个退出状态
@bela83如果您运行的是Ubuntu,那么我认为安装
libgsl0 dev
会自动创建链接。有关使用共享库的一般信息,请参阅,特别是第节。3.1.1可能与当前讨论有关。