如何获取库的安装路径
How to get the path where the library is installed
我在 Linux 工作,我有一个用 Fortran 90 编写的库(由第 3 方编写),它正在从当前工作目录中的文件中读取。我希望能够从其他文件夹调用生成的库,因此我需要读取库的安装路径。我如何知道 Fortran 代码中已编译库的路径?
我需要将代码中的路径存储在变量中。
谁知道python,我想达到和
一样的效果
import os
os.path.dirname(os.path.abspath(__file__))
但在 f90 中(参见 Get location of the .py source file)
根据评论中的建议,我做了以下工作:
export DATAPATH=`pwd`
make
在生成文件中
ifort -O3 -fpic -fpp -DDATAPATH -c mysource.f90
在 mysource.f90
subroutine mysub
character(len=100)::dpath
#ifdef DATAPATH
dpath=DATAPATH
#endif
open(10,file=trim(dpath)//'initialise.dat')
....
....
问题是在编译时我得到
mysource.f90(42): error #6054: A CHARACTER data type is required in this context. [1]
dpath=1
----------^
compilation aborted for mysource.f90 (code 1)
如果您愿意,可以在编译时修复路径。像
gfortran -cpp mylib.f90 -DPREFIX=\"/usr/local/\"
open(newunit=u,file=PREFIX//'mylib/initialise.dat')
你必须确保库确实安装在那个地方PREFIX/mylib/
您可以创建一个包含数据路径的环境变量。这个变量可以手动设置,在你的 .bashrc
或 .bash_profile
或系统 /etc/profile.d/
或 /etc/bash.bashrc
中,有很多方法,它们取决于库是否只用于一个用户或某些大型计算机的所有用户。
例如
export MYLIB_PATH='/usr/local/mylib'
然后就可以将Fortran中的变量读取为
CALL get_environment_variable("MYLIB_PATH", mylib_path, status=stat)
路径现在在变量 mylib_path
中。您可以通过检查是否 stat==0
来检查是否成功。
这不是唯一可能的方法。您还可以在您的主目录中为您的库创建一个配置文件:
mkdir $HOME/.config/mylib/
echo "/usr/local/mylib" > $HOME/.config/mylib/path
然后如果没有设置环境变量,你可以尝试从这个文件中读取路径
if (stat/=0) then
CALL get_environment_variable("HOME", home_dir)
open(newunit=path_unit, file=home_dir//'/.config/mylib/path',status='old',action='read',iostat=stat)
if (stat/=0) complain
read(path_unit,'(a)',iostat=stat) mylib_path
if (stat/=0) complain
end if
因此,当您使用 -DDATAPATH 进行编译时,您没有将变量 DATAPATH 传递到您的代码中,只是将一个名为 DATAPATH 的符号声明为 true,因此 ifort 会将 DATAPATH 替换为 1。您需要做的是将其作为值:
-DDATAPATH="$(DATAPATH)"
为了编译工作。
我在 Linux 工作,我有一个用 Fortran 90 编写的库(由第 3 方编写),它正在从当前工作目录中的文件中读取。我希望能够从其他文件夹调用生成的库,因此我需要读取库的安装路径。我如何知道 Fortran 代码中已编译库的路径?
我需要将代码中的路径存储在变量中。
谁知道python,我想达到和
一样的效果import os
os.path.dirname(os.path.abspath(__file__))
但在 f90 中(参见 Get location of the .py source file)
根据评论中的建议,我做了以下工作:
export DATAPATH=`pwd`
make
在生成文件中
ifort -O3 -fpic -fpp -DDATAPATH -c mysource.f90
在 mysource.f90
subroutine mysub
character(len=100)::dpath
#ifdef DATAPATH
dpath=DATAPATH
#endif
open(10,file=trim(dpath)//'initialise.dat')
....
....
问题是在编译时我得到
mysource.f90(42): error #6054: A CHARACTER data type is required in this context. [1]
dpath=1
----------^
compilation aborted for mysource.f90 (code 1)
如果您愿意,可以在编译时修复路径。像
gfortran -cpp mylib.f90 -DPREFIX=\"/usr/local/\"
open(newunit=u,file=PREFIX//'mylib/initialise.dat')
你必须确保库确实安装在那个地方PREFIX/mylib/
您可以创建一个包含数据路径的环境变量。这个变量可以手动设置,在你的 .bashrc
或 .bash_profile
或系统 /etc/profile.d/
或 /etc/bash.bashrc
中,有很多方法,它们取决于库是否只用于一个用户或某些大型计算机的所有用户。
例如
export MYLIB_PATH='/usr/local/mylib'
然后就可以将Fortran中的变量读取为
CALL get_environment_variable("MYLIB_PATH", mylib_path, status=stat)
路径现在在变量 mylib_path
中。您可以通过检查是否 stat==0
来检查是否成功。
这不是唯一可能的方法。您还可以在您的主目录中为您的库创建一个配置文件:
mkdir $HOME/.config/mylib/
echo "/usr/local/mylib" > $HOME/.config/mylib/path
然后如果没有设置环境变量,你可以尝试从这个文件中读取路径
if (stat/=0) then
CALL get_environment_variable("HOME", home_dir)
open(newunit=path_unit, file=home_dir//'/.config/mylib/path',status='old',action='read',iostat=stat)
if (stat/=0) complain
read(path_unit,'(a)',iostat=stat) mylib_path
if (stat/=0) complain
end if
因此,当您使用 -DDATAPATH 进行编译时,您没有将变量 DATAPATH 传递到您的代码中,只是将一个名为 DATAPATH 的符号声明为 true,因此 ifort 会将 DATAPATH 替换为 1。您需要做的是将其作为值:
-DDATAPATH="$(DATAPATH)"
为了编译工作。