调用库子例程时出现链接器错误

问题描述 投票:0回答:1

我用 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退出状态

这个问题如何解决?

linker-errors gfortran fortran90 ldd
1个回答
0
投票

由于名称修改,您的子例程在“.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 
© www.soinside.com 2019 - 2024. All rights reserved.