【问题标题】:Fortran shared lib .so shows undefined symbol errorFortran 共享库 .so 显示未定义符号错误
【发布时间】:2021-10-14 15:09:56
【问题描述】:

我正在编译 Fortran 代码以获取共享库 .so。在代码中它使用了一个模块。编译没有问题,打开.so库报undefined symbol错误。

代码mesh_map.F如下:

#include "cfx5ext.h"
dllexport(mesh_map)
      SUBROUTINE mesh_map (CZ, DZ, IZ, LZ, RZ)
      USE EXTRA_FLUID2
      USE ISO_C_BINDING
      USE IFPORT
      IMPLICIT NONE
      CHARACTER*(1) CZ(*)
      DOUBLE PRECISION DZ(*)
      INTEGER IZ(*)
      LOGICAL LZ(*)
      REAL RZ(*)

      MAP_STATUS = 1
 
      END

extra_fluid2.f90

Module EXTRA_FLUID2
INTEGER :: map_status = 0
end module EXTRA_FLUID2

编译命令:

ifort -c extra_fluid2.f90
/home/xxx/intel/oneapi/compiler/2021.4.0/linux/bin/intel64/ifort -fpic -assume 2underscore -check uninit -warn declarations -diag-error 6717 -ftz -O2 -fp-speculation=safe -fp-model=precise -fp-model=source -fimf-arch-consistency=true -qno-opt-dynamic-align -fpe0 -fomit-frame-pointer -real-size 32 -integer-size 32 -I/usr/ansys_inc/v192/CFX/include -o linux-amd64/ifort/mesh_map.o -c mesh_map.F
 -lrt/xxx/intel/oneapi/compiler/2021.4.0/linux/bin/intel64/ifort -shared -o ./linux-amd64/ifort/libmesh_map.so linux-amd64/ifort/mesh_map.o extra_fluid2.o

当我使用以下命令检查 .so 库时:

ldd -r libmesh_map.so 

结果显示为:

undefined symbol: extra_fluid2_mp_map_status__  (./libmesh_map.so)

我该如何解决这个问题?谢谢。

【问题讨论】:

  • 什么操作系统?该目录在 LD_LIBRARY_PATH 中吗?
  • cfx5ext.h 中有什么,为什么你使用模块 iso_c_bindingifport 但不引用它们中的任何实体?
  • 是Linux(CentOS)系统。引用map_status是通过“使用extra_fluid2”,所以LD_LIBRARY_PATH中需要添加目录吗?
  • cfx5ext.h、iso_c_bindng 和 ifport 用于内存映射文件和其他用途。但是在这里我删除了这些功能,因为这些部分没有错误。

标签: compilation fortran shared-libraries


【解决方案1】:

你必须在两个编译中都使用-assume 2underscore,使用/不使用选项不能混用。 extra_fluid2.f90 也应该使用选项 -fpic 编译。对应该进入同一个可执行文件或共享对象的文件使用不同的标志集通常是个坏主意。

【讨论】:

  • 感谢您的解决方案!它对我有用。
猜你喜欢
  • 1970-01-01
  • 2010-11-09
  • 2018-03-10
  • 1970-01-01
  • 2021-07-22
  • 2011-02-28
  • 2018-04-14
  • 2016-10-16
  • 2010-11-04
相关资源
最近更新 更多