Fortran 共享库 .so 显示未定义的符号错误
Fortran shared lib .so shows undefined symbol error
我正在编译 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)
我该如何解决这个问题?谢谢。
你必须在两个编译中使用-assume 2underscore
,using/not不能混合使用该选项。
此外 extra_fluid2.f90
应该使用选项 -fpic 进行编译。对于应该进入同一可执行文件或共享对象的文件使用不同的标志集通常是一个坏主意。
我正在编译 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)
我该如何解决这个问题?谢谢。
你必须在两个编译中使用-assume 2underscore
,using/not不能混合使用该选项。
此外 extra_fluid2.f90
应该使用选项 -fpic 进行编译。对于应该进入同一可执行文件或共享对象的文件使用不同的标志集通常是一个坏主意。