Общая библиотека в Fortran, минимальный пример не работает

Я пытаюсь понять, как динамически создавать и связывать общую библиотеку в Fortran под Linux.

у меня два файла: первый, liblol.f90, выглядит так:

subroutine func()
    print*, 'lol!'
end subroutine func

я компилирую его с gfortran -shared -fPIC -o liblol.so liblol.f90

второй файл, main.f90, выглядит так:

program main
    call func()
end program main

теперь, когда я пытаюсь скомпилировать это с помощью команды gfortran -L. -llol main.f90 -o main, Я получаю следующую ошибку:

/tmp/ccIUIhcE.o: In function `MAIN__':
main.f90:(.text+0xa): undefined reference to `func_'
collect2: ld returned 1 exit status

Я не понимаю, почему он говорит "не определено ссылка", так как вывод nm -D liblol.so дает мне это:

                 w _Jv_RegisterClasses
0000000000201028 A __bss_start
                 w __cxa_finalize
                 w __gmon_start__
0000000000201028 A _edata
0000000000201038 A _end
0000000000000778 T _fini
                 U _gfortran_st_write
                 U _gfortran_st_write_done
                 U _gfortran_transfer_character_write
0000000000000598 T _init
00000000000006cc T func_

необходим ли какой-либо другой параметр?

1 ответов


единственное, что нужно изменить, это порядок аргументов, как в

gfortran -L. main.f90 -llol -o main

да, только главное.f90 и-llol обращены. Надеюсь, это спасет кому-то год его жизни, который я только что потерял. В связи с этим, если вы пытаетесь скомпилировать программу, которая использует LAPACK или BLAS (которая не работала для меня и поэтому в первую очередь я пытался создать общую библиотеку самостоятельно), то же самое относится. напишите имя исходного файла первый:

gfortran mylapack.f90 -llapack -lblas -o mylapack

причину этого можно найти на страницах руководства, см. Верхнюю часть http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html для опции-l:

это имеет значение, где в команде вы пишете эту опцию; компоновщик выполняет поиск и обработку библиотек и объектных файлов в порядке они указаны. Таким образом, foo.o -lz bar.o поиск библиотека z после файл foo.o, но перед баром.o. Если бар.о относится к функции в `з', эти функции могут не загружаться.