我正在尝试使用名为“decomp_2d”的外部库和我的fortran程序。我有一个声明为“DECOMP2D”的环境变量,它指向“decomp_2d”所在的目录。该目录具有以下结构:
[k00603@fe01p03 2decomp_fft]$ls
doc examples include lib Makefile README src
[k00603@fe01p03 2decomp_fft]$ls lib/
lib2decomp_fft.a Makefile
[k00603@fe01p03 2decomp_fft]$ls include/
decomp_2d_fft.mod decomp_2d_io.mod decomp_2d.mod glassman.mod
在另一个目录中,我试图调用一个使用该库子程序的程序。但是当我这样做时,我得到一个编译时错误。我附加了一个我正在使用的最小fortran代码和我用来编译的Makefile。它是富士通机器,他们有自己的fortran编译器,我用它来编译:
该计划:
program Sora_v71
! Use the external library
use decomp_2d
integer n
call decomp_2d_init(n,n,n,n,n)
stop
end
生成文件:
# Lines included for using the 2decomp libraries
INC_2DECOMP = -I$(DECOMP2D)/include/
L2DECOMP = -L$(DECOMP2D)/lib/ -l2decomp_fft
## ------------------------------------------------------
RM = rm
SRCDIR = .
LIBDIR = .
BIN = binary
OBJS = main.o
## -------------------------------------------------------
mpifrtpx=$(shell which mpifrtpx)
FC=$(mpifrtpx)
FFLAGS = $(F90FLAG) $(INC_2DECOMP)
LFLAGS = $(F90FLAG) -L$(LIBDIR) $(L2DECOMP)
## -------------------------------------------------------
all: $(BIN)
$(BIN): $(OBJS)
@echo Linking $(BIN) .....
$(FC) $(LFLAGS) -o $@ $(OBJS)
.f.o:
@echo Compiling $*.f
$(FC) $(FFLAGS) -c $(SRCDIR)/$*.f
clean:
@echo 'Cleaning .....'
$(RM) -f core *.o *~ *.L *.O $(BIN) $(SIZE_FILE)
当我输入“make”时,我收到以下错误:
[k00603@fe01p04 test]$make
Compiling main.f
/opt/FJSVtclang/GM-1.2.0-11/bin/mpifrtpx -I/home/hp120242/k00603/2decomp_fft//include/ -c ./main.f
Linking binary .....
/opt/FJSVtclang/GM-1.2.0-11/bin/mpifrtpx -L. -L/home/hp120242/k00603/2decomp_fft//lib/ -l2decomp_fft -o binary main.o
main.o: In function `MAIN__':
main.f:(.text+0x4c): undefined reference to `decomp_2d.decomp_2d_init_'
main.o:(.data+0x0): undefined reference to `decomp_2d.decomp_2d_init_'
make: *** [binary] Error 1
有什么想法吗?
答案 0 :(得分:2)
对于某些链接器,链接命令中库的顺序很重要。通常,它们必须在引用它们的目标文件之后。尝试在链接命令中切换$(LFLAGS)
和$(OBJS)
。