gpt4 book ai didi

linux - Fortran 中的共享库,最小示例不起作用

转载 作者:IT王子 更新时间:2023-10-29 00:11:49 28 4
gpt4 key购买 nike

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

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

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in `z', those functions may not be loaded.

关于linux - Fortran 中的共享库,最小示例不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10112185/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com