首页 > 解决方案 > Fortran 共享库 .so 显示未定义符号错误

问题描述

我正在编译 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)

我怎样才能解决这个问题?谢谢。

标签: compilationfortranshared-libraries

解决方案


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


推荐阅读