我试图了解如何在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
我不明白为什么它会说“未定义的引用”,因为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_
是否还需要其他参数?
答案 0 :(得分:13)
唯一需要改变的是参数的顺序,如
gfortran -L. main.f90 -llol -o main
是的,只有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但在bar.o之前如果bar.o引用'z'中的函数, 这些功能可能无法加载。