【问题标题】:Syntax for setting paths to library and compiler in makefile在 makefile 中设置库和编译器路径的语法
【发布时间】:2017-12-03 17:52:00
【问题描述】:

我正在尝试编译一个程序,我必须在 Makefile 中设置 NETCDF inc 和 lib 目录的路径,并设置 gfortran 和 c 编译器设置。变量已经命名如下所示,它只是告诉我编辑我尝试过的路径/选项。这是我的 netcdf inc 和 lib 以及 hdf5 的内容:

NETCDFINC = -I$(NETCDFF_INCDIR) -I$(NETCDFC_INCDIR)
NETCDFLIB = -Wl,-rpath=$(NETCDFF_LIBDIR) -L$(NETCDFF_LIBDIR) -Wl,-
rpath=$(NETCDFC_LIBDIR) -L$(NETCDFC_LIBDIR) -Wl,-rpath=$(HDF5_LIBDIR) -
L$(HDF5_LIBDIR) -lhdf5_hl -lhdf5 -lz

请注意,NETCDFLIB 在我的文件中的一行,并且变量的路径是正确的,但语法可能不正确。

对于 fortran 和 c 编译器信息,我有以下内容:

FC   = gfortran -m64 -g -O0 -ffixed-line-length-132 -Wunused -Wuninitialized  
CC   = gcc 
CFLAGS = -m64 -c -g -I. -DLONG32 -DUNDERSCORE -DLITTLE -Wunused -
Wuninitialized

最后,当我运行程序时,我首先收到一堆警告,例如:

oban_namelist.f90:495.29:

 real              :: flt
                         1
Warning: Unused variable 'flt' declared at (1)

后面跟着一堆未定义的引用错误如:

oban.o: In function `check':
/uufs/chpc.utah.edu/common/home/zpu-
group3/dhodges/DART/data/radar/opaws/oban.f90:1902: undefined reference to 
`__netcdf_MOD_nf90_strerror'

错误不应该出现在这个 oban.o 函数中,因为它不是我写的。我在上面列出的程序中为 netcdf 路径和 gfortran/c 信息编辑了唯一的东西,所以我认为错误就在那里。这是我在这里的第一个问题,所以如果我错过了您需要的任何内容,请随时提出。我可以尝试什么?

编辑:根据要求,这是我正在使用的整个 makefile。另外,我只需键入“make”即可按照 README 文件中的说明进行编译。

# Makefile for creating the OPAWS analysis software
#
# Rev: 02/05/10 LJW
#      12/05/10 DCD
#      02/11/11 LJW
#

# netCDF4 libs - you need to fill in the blanks

NETCDFINC = -I$(NETCDFF_INCDIR) -I$(NETCDFC_INCDIR)
NETCDFLIB = -Wl,-rpath=$(NETCDFF_LIBDIR) -L$(NETCDFF_LIBDIR) -Wl,-rpath=$(NETCDFC_LIBDIR) -L$(NETCDFC_LIBDIR) -Wl,-rpath=$(HDF5_LIBDIR) -
L$(HDF5_LIBDIR) -lhdf5_hl -lhdf5 -lz

# Fortran and C compiler information - various configurations are setup, try and find one close

#=====>> Gfortran 
#  
FC   = gfortran -m64 -g -O0 -ffixed-line-length-132 -Wunused -Wuninitialized 
CC   = gcc
CFLAGS = -m64 -c -g -I. -DLONG32 -DUNDERSCORE -DLITTLE -Wunused -Wuninitialized

# Leave this stuff alone

EXEC = x.oban
EXECcs = x.clutter_stats
EXECmd = mosaic_2_dart

OBJS = DART.o oban_module.o dict_module.o oban_namelist.o derived_types.o util.o fileio.o read_dorade.o binio.o v5d.o 
OBJScs = DART.o dict_module.o oban_namelist.o derived_types.o fileio.o util.o read_dorade.o binio.o v5d.o
OBJSmd = DART.o dict_module.o oban_namelist.o derived_types.o fileio.o util.o read_dorade.o binio.o v5d.o

default: $(EXEC) $(EXECcs) $(EXECmd)

$(EXEC): $(OBJS) oban.o
    $(FC) $(OPT) -o $(EXEC) oban.o $(OBJS) $(NETCDFLIB)

$(EXECcs): $(OBJScs) clutter_stats.o
    $(FC) $(OPT) -o $(EXECcs) clutter_stats.o $(OBJScs) $(NETCDFLIB)

$(EXECmd): $(OBJSmd) mosaic_2_dart.o
    $(FC) $(OPT) -o $(EXECmd) mosaic_2_dart.o $(OBJSmd) $(NETCDFLIB)

clean:
    rm $(EXEC) oban.o $(OBJS) $(EXECcs) clutter_stats.o $(OBJScs) $(EXECmd) mosaic_2_dart.o $(OBJSmd) *.mod ncgen.input *.pyc sweep_file_list.txt

# Individual compilation instructions

oban.o: oban.f90 structures.inc opaws.inc DART.o
    $(FC) $(OPT) -c $(NETCDFINC) oban.f90

clutter_stats.o: clutter_stats.f90 opaws.inc
    $(FC) $(OPT) -c $(NETCDFINC) clutter_stats.f90

mosaic_2_dart.o: mosaic_2_dart.f90 opaws.inc
    $(FC) $(OPT) -c $(NETCDFINC) mosaic_2_dart.f90

oban_module.o: oban_module.f90 derived_types.o opaws.inc
    $(FC) $(OPT) -c oban_module.f90

read_dorade.o: read_dorade.c read_dorade.h
    $(CC) $(CFLAGS) -c read_dorade.c

fileio.o: fileio.f90
    $(FC) $(OPT) $(NETCDFINC) -c fileio.f90

util.o: util.f opaws.inc structures.inc
    $(FC) $(OPT) -c util.f

DART.o: DART.f
    $(FC) $(OPT) -c DART.f

derived_types.o: derived_types.f90
    $(FC) $(OPT) -c derived_types.f90

oban_namelist.o: oban_namelist.f90 opaws.inc
    $(FC) $(OPT) -c oban_namelist.f90

dict_module.o: dict_module.f90
    $(FC) $(OPT) -c dict_module.f90

binio.o: binio.c
    $(CC) $(CFLAGS) binio.c -o binio.o

v5d.o: v5d.c
    $(CC) $(CFLAGS) v5d.c -o v5d.o

【问题讨论】:

  • undefined reference to '__netcdf_MOD_nf90_strerror' 是链接器错误。 (f90 表明它与 fortran 相关)它告诉你它不知道__netcdf_MOD_nf90_strerror 是什么。可能是因为您错过了头文件包含(或-I/path/to/it),或者它只是在使用之前没有声明。发布整个 Makefile 以及可用于成功构建代码的编译字符串(如果有的话)。这将使我们能够缩小问题所在。
  • 您是否还有一份您更改后要比较的原始行的副本?在不知道如何编译您要编译的内容的情况下,这会使回答变得非常困难。 oban.o 库看不到 __netcdf_MOD_nf90_strerror 的声明。您是否更改了 Makefile 中任一变量的部分顺序?它正在寻找在您的编译字符串中到达oban.o 之前可能需要指定的内容。
  • 我在上面添加了makefile。原始代码如下,我可以编辑空白:NETCDFINC = -I/ / /netcdf4-64/include NETCDFLIB = -L/ / /netcdf4-64/lib -lm -lnetcdf -L/ / /hdf5/lib -lhdf5_hl -lhdf5 -lz 和 FC = gfortran -m64 -g -O0 -Wl,-stack_size,10000000 -fixed-line-length-132 -Wunused -Wuninitialized CC = gcc CFLAGS = -m64 -c -g -I。 -DLONG32 -DUNDERSCORE -DLITTLE - Wunused -Wuninitialized 要编译,我只需键入 make,这就是指令所说的。我没有更改调用它们的顺序。
  • @DavidC.Rankin,以下是自述文件中的说明,如果这有助于了解:“所需软件:1. Fortran 编译器 (gfortran/Intel) 2. CC 编译器(gcc 很好) 3. 使用 fortran (3 或 4) BUILD 指令安装 netCDF3/4 1. 编辑 Makefile 以放入您的 fortran 和 C 编译器。提供了两个示例。 2. 设置到 netCDF 库的正确链接。fortran 需要包含使用netcdf模块接口的目录。 3. 输入“make”进行编译。构建了两个可执行文件:x.oban和x.clutter_stats
  • 从您的错误来看,“* 2. 设置正确的 netCDF 库链接。fortran 需要包含目录才能使用 netcdf 模块接口。*”不知道__netcdf_MOD_nf90_strerror 是什么。您确定它安装了正确的链接,以便-I$(NETCDFF_INCDIR)-L$(NETCDFF_LIBDIR) 正确解析。我不会编译很多 fortran,是否需要任何 -lcdf... 库?

标签: c makefile environment gfortran undefined-reference


【解决方案1】:

通过如下编辑 NETCDFLIB 行解决了问题:

 I edited the NETCDFLIB line as follows and it works: NETCDFLIB = -Wl,-
rpath=$(NETCDFF_LIBDIR) -L$(NETCDFF_LIBDIR) -Wl,-rpath=$(NETCDFC_LIBDIR) -
L$(NETCDFC_LIBDIR) -lnetcdff -lnetcdf -lm -Wl,-rpath=$(HDF5_LIBDIR) -
L$(HDF5_LIBDIR) -lhdf5_hl -lhdf5 -lz 

基本上我只需要添加:

-lnetcdff -lnetcdf -lm

这允许编译器访问它需要的最初未定义的库。

【讨论】:

    猜你喜欢
    • 2019-07-10
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多