我试图了解如何在Linux下的Fortran中动态创建和链接共享库。

我有两个文件:第一个文件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

我不明白为什么它说“ undefined reference ”,因为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_

是否需要其他参数?

最佳答案

唯一需要更改的是参数的顺序,如

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

是的,只有main.f90和-llol被颠倒了。我希望这样可以节省别人他的生活一年,我只是失去了对这个。与此相关的是,如果您尝试编译使用LAPACK或BLAS的程序(这对我不起作用,这就是为什么我首先尝试自己创建共享库的原因),则同样适用。 首先写源文件的名称:
gfortran mylapack.f90 -llapack -lblas -o mylapack

可以在手册页中找到原因,有关选项-l,请参见http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html的顶部:

09-04 01:59