我用 Fortran 创建了一个简单的共享库,并在测试程序中使用了它。库模块在名为 my_module.f90 的文件中包含一个子例程,即:
! my_module.f90
模块我的_模块
contains
subroutine my_subroutine()
print *, "Hello from my_subroutine!"
end subroutine my_subroutine
结束模块 my_module
我使用以下命令编译了它:
gfortran -共享-fPIC my_module.f90 -o libmy_library.so
我创建了一个名为 test_program.f90 的文件:
!测试程序.f90
program main
implicit none
external :: my_subroutine
call my_subroutine()
end program main
当我使用共享库编译测试程序时:
gfortran test_program.f90 -o test_program -L。 -lmy_library
失败的原因是
对“my_subroutine_”的未定义引用 收集2:错误:ld返回1退出状态
这个问题如何解决?
由于名称修改,您的子例程在“.so”中具有其他名称。文件:
[gmt@arch ~]$ nm libmy_library.so
w __cxa_finalize@GLIBC_2.2.5
0000000000004020 d __dso_handle
0000000000003dd8 d _DYNAMIC
00000000000011d4 t _fini
U _gfortran_st_write_done@GFORTRAN_8
U _gfortran_st_write@GFORTRAN_8
U _gfortran_transfer_character_write@GFORTRAN_8
0000000000003fe8 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
0000000000002028 r __GNU_EH_FRAME_HDR
0000000000001000 t _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000001139 T __my_module_MOD_my_subroutine
U __stack_chk_fail@GLIBC_2.4
0000000000004028 d __TMC_END__
您可以使用
BIND(C,...
来解决此问题。
subroutine my_subroutine() BIND(C,NAME="my_subroutine_")
print *, "Hello from my_subroutine!"
end subroutine my_subroutine