2016-10-24 3 views
0

Я работаю в Linux, и у меня есть библиотека, написанная на Fortran 90 (написанная третьей стороной), которая читается из файла в текущем рабочем каталоге. Я хотел бы иметь возможность вызвать полученную библиотеку из других папок, поэтому мне нужно прочитать путь, в котором установлена ​​библиотека. Как узнать путь к скомпилированной библиотеке в коде Fortran?Как получить путь, где установлена ​​библиотека

Мне нужно сохранить в переменной путь в коде.

Ибо кто знает питон, я хочу, чтобы достичь такой же, как

import os 
os.path.dirname(os.path.abspath(__file__)) 

но в F90 (см Get location of the .py source file)

Используя предложения в комментарии я сделал следующее:

export DATAPATH=`pwd` 
make 

в Makefile

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) 
+1

Я вообще не понимаю. Вы спрашиваете, где исходный код для вашей библиотеки на вашем жестком диске? –

+0

да, я добавил строку к вопросу, в надежде быть более ясным. – simona

+0

Инициализационный файл находится в том же пути исходного кода (это тот же путь, что и скомпилированная библиотека). библиотека должна знать путь к исходному коду, чтобы он мог найти файл инициализации – simona

ответ

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 
+0

просто слово на макросе '__FILE__': оно не возвращает имя файла с полным путем, а только имя файла (в данном случае« source.f90 » ') – simona

+0

Это странно, см. Http://stackoverflow.com/questions/8487986/file-macro-shows-full-path –

+0

Это fortran, может ли это изменить ситуацию? – simona

1

Итак, когда вы скомпилировали с -DDATAPATH, что вы не передали переменную DATAPATH в свой код, объявили только символ DATAPATH как true, поэтому ifort заменит DATAPATH на 1.Что вам нужно сделать, это передать его в качестве значения:

-DDATAPATH="$(DATAPATH)" 

Для компиляции для работы.

+1

Это еще не все. (подсказка: круглые скобки и кавычки) –

+0

Правда пропустил кавычки, но вам нужны скобки, поскольку это переменная makefile, а не переменная оболочки? – Rob

+0

Есть команда экспорта, а затем сделать в исходном вопросе, это переменная оболочки. –

Смежные вопросы