9

我试图了解如何在 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

当我现在尝试使用 command 编译它时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_

是否需要任何其他参数?

4

1 回答 1

16

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

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 之后但在 bar.o 之前foo.o -lz bar.o搜索库。z如果 bar.o 引用了 `z' 中的函数,这些函数可能不会被加载。

于 2012-04-12T13:46:06.180 回答