在 fortran 中使用 fgsl:如何使用 gfortran 进行编译
Use fgsl in fortran: how to compile with gfortran
我正在尝试做一些基本的事情,但是我找不到关于如何编译的相关信息。我尝试了以下但没有成功:
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(德语页面,但很容易理解)所以我想没问题。
可能编译命令的语法不正确?
编辑:
我编辑了我的首字母 post 以免在评论中隐藏重要信息。
这些是库的路径:
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
。它们包含这些模块的接口信息。请注意,模块名和文件名之间不需要映射(尽管编程准则可能需要这一点)。
找到语句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) 看了包里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`
我正在尝试做一些基本的事情,但是我找不到关于如何编译的相关信息。我尝试了以下但没有成功:
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(德语页面,但很容易理解)所以我想没问题。
可能编译命令的语法不正确?
编辑:
我编辑了我的首字母 post 以免在评论中隐藏重要信息。
这些是库的路径:
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
。它们包含这些模块的接口信息。请注意,模块名和文件名之间不需要映射(尽管编程准则可能需要这一点)。
找到语句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) 看了包里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`