【问题标题】:gfortran: symbol(s) not found for architecture x86_64gfortran:未找到架构 x86_64 的符号
【发布时间】:2015-10-19 08:30:13
【问题描述】:

一周以来,我一直在尝试编译用 F90 和 C 编写的代码。我不断收到未定义符号错误。我会尽量提供尽可能多的信息,但该软件包包含数百个文件,因此提供所有细节有点困难。这是Makefile

include paths.mk
include include.mk.$(OPT)
#------------------------------------------------------------------------------------------#


#------------------------------------------------------------------------------------------#
#      Double check that the "LOWO" flags have been set.  In case they have not, clone the #
# standard options.  LOWO stands for LOWer Optimisation, and these flags are used for a    #
# subroutines that are taking several hours to compile with ifort-13 (ed_state_vars.f90    #
# and a few others).                                                                       #
#------------------------------------------------------------------------------------------#
ifeq ($(F_LOWO_OPTS),)
   F_LOWO_OPTS = $(F_OPTS)
endif
#------------------------------------------------------------------------------------------#



#----- Compiler commands. -----------------------------------------------------------------#
INCLUDES         = $(PAR_INCS) -I$(ED_INCS) $(HDF5_INCS) $(MPI_INCS) 
F90_COMMAND      = $(F_COMP) -c $(F_OPTS) $(INCLUDES) $(PAR_DEFS)
F90_LOWO_COMMAND = $(F_COMP) -c $(F_LOWO_OPTS) $(INCLUDES) $(PAR_DEFS)
FPP_COMMAND      = $(F_COMP) -c -DUSE_INTERF=$(USE_INTERF) -DUSENC=$(USENC) -D$(CMACH)     \
                   -DUSE_HDF5=$(USE_HDF5) -DUSE_COLLECTIVE_MPIO=$(USE_COLLECTIVE_MPIO)     \
                   -DUSE_MPIWTIME=$(USE_MPIWTIME) $(F_OPTS) $(INCLUDES) $(PAR_DEFS)
FPP_LOWO_COMMAND = $(F_COMP) -c -DUSE_INTERF=$(USE_INTERF) -DUSENC=$(USENC) -D$(CMACH)     \
                   -DUSE_HDF5=$(USE_HDF5) -DUSE_COLLECTIVE_MPIO=$(USE_COLLECTIVE_MPIO)     \
                   -DUSE_MPIWTIME=$(USE_MPIWTIME) $(F_LOWO_OPTS) $(INCLUDES) $(PAR_DEFS)
CXX_COMMAND      = $(C_COMP) -c $(C_OPTS) -D$(CMACH) $(HDF5_INCS) $(INCLUDES) $(PAR_DEFS)
#------------------------------------------------------------------------------------------#


#----- Define archive and executable names. -----------------------------------------------#
EXE=$(BASE)/ed_$(ED_VERSION)-$(OPT)
LIBMODEL=$(BASE)/ed_$(ED_VERSION)-$(OPT).a
#------------------------------------------------------------------------------------------#

include objects.mk

#----- Define targets. --------------------------------------------------------------------#

all:
    make gendep
    make $(EXE)
    make $(EXE)
    make $(EXE)
    make $(EXE)
    make $(EXE)


gendep:
    @echo ""
    ./generate_deps.sh $(ED_ROOT)
    @echo === Finished dependencies ===

$(EXE): $(LIBMODEL) $(MAINOBJ) 
    @echo ""
    $(LOADER) -o $(EXE) edmain.o $(LOADER_OPTS) $(INCLUDES) $(LIBMODEL) $(HDF5_LIBS)   \
    $(PAR_LIBS) $(NC_LIBS) $(LIBS) $(LOADER_OPTS)
    @echo ""
    @echo Finished building === $(EXE)
    @echo ""

$(MAINOBJ):  $(MAIN) 
    @echo ""
    cp -f $< $(<F:.F90=.F90)
    $(FPP_COMMAND) $(<F:.F90=.F90)
    rm -f $(<F:.F90=.F90)

$(LIBMODEL): $(OBJ_MODEL)
    $(ARCHIVE) $(LIBMODEL) $(OBJ_MODEL)

FORCE: 

install:
    @echo ""
    ln -fs `pwd`/$(EXE) ../run/$(BASE)
    ln -fs `pwd`/$(EXE) ../test/$(BASE)
    @echo ""

clean:
    @echo ""
    rm -f $(LIBMODEL) $(EXE) *.o *.mod *.F90 *.f90 *.stb *.d dependency.mk 
    rm -f ../$(EXE) ../$(LIBMODEL)
    touch dependency.mk
    @echo ""

#----- Define rules -----------------------------------------------------------------------#
include rules.mk

Makefile 包含这个其他文件

# Define make (gnu make works best).

MAKE=/usr/bin/make

# libraries.

BASE=$(ED_ROOT)/build/

# Activate appropriate parts below, comment out others.

# HDF 5  Libraries
# ED2 HAS OPTIONAL HDF 5 I/O
# If you wish to use this functionality specify USE_HDF5=1
# and specify the location of the include directory
# library files. Make sure you include the zlib.a location too.

USE_HDF5=1
HDF5_INCS=-I/opt/local/include
HDF5_LIBS= -L/opt/local/lib -lhdf5 -lhdf5_fortran -lz -L/opt/local/lib/libgcc/ -lstdc++ -lm

#---------------------------------------------------------------
# If you have a version of hdf5 compiled in parallel, then you
# may benefit from collective I/O, then use this flag = 1
# Otherwise, set it to zero.

USE_COLLECTIVE_MPIO=0

#---------------------------------------------------------------

# interface ----------------------------------------------------
# This should be 1 unless you are running with -gen-interfaces.
# Interfaces usually make the compilation to crash when the 
# -gen-interfaces option are on, so this flag bypass all 
# interfaces in the code.
USE_INTERF=1


# MPI_Wtime. ---------------------------------------------------
# If USE_MPIWTIME=1, then it will use MPI libraries to compute
# the wall time (the only double-precision intrinsic).  In case
# you don't have it, leave USE_MPIWTIME=0, in which case it will
# use a simpler, single-precision function.
USE_MPIWTIME=0


#-----------------  MAC_OS_X (Leopard) ---- gfortan/gcc ---------------
CMACH=MAC_OS_X
F_COMP=gfortran
C_COMP=gcc
LOADER=gfortran

##################################### COMPILER OPTIONS #####################################

#------------------------------------------------------------------------------------------#
USE_INTERF=1
F_OPTS= -O0 -ffree-line-length-none
C_OPTS= -O0 -DLITTLE -stdlib=libstdc++
F_LOWO_OPTS= -O0 -ffree-line-length-none
LOADER_OPTS= -O0 -ffixed-line-length-none
#------------------------------------------------------------------------------------------#

# For IBM,HP,SGI,ALPHA,LINUX use these:
ARCHIVE=ar rs
# For NEC SX-6
#ARCHIVE=sxar rs
# For SUN,CONVEX
#ARCHIVE=ar r'

除了一些警告之外,编译看起来还不错。然后在链接阶段出现问题。 make 的最后几行如下:

    ar rs /Users/manfredo/Desktop/ED2/ED/build//ed_2.1-opt.a allometry.o an_header.o

    !!!all other object files listed!!!

therm_lib.o therm_lib8.o twostream_rad.o update_derived_props.o utils_c.o utils_f.o vegetation_dynamics.o

ar: creating archive /Users/manfredo/Desktop/ED2/ED/build//ed_2.1-opt.a
    /opt/local/bin/ranlib: file: /Users/manfredo/Desktop/ED2/ED/build//ed_2.1-opt.a(consts_coms.o) has no symbols
    /opt/local/bin/ranlib: file: /Users/manfredo/Desktop/ED2/ED/build//ed_2.1-opt.a(ed_max_dims.o) has no symbols

    cp -f /Users/manfredo/Desktop/ED2/ED/src/driver/edmain.F90 edmain.F90
    gfortran -c -DUSE_INTERF=1 -DUSENC= -DMAC_OS_X -DUSE_HDF5=1 -DUSE_COLLECTIVE_MPIO=0 -DUSE_MPIWTIME=0 -O0 -ffree-line-length-none  -I/Users/manfredo/Desktop/ED2/ED/src/include -I/opt/local/include    edmain.F90
    rm -f edmain.F90

    gfortran -o /Users/manfredo/Desktop/ED2/ED/build//ed_2.1-opt edmain.o -O0 -ffixed-line-length-none  -I/Users/manfredo/Desktop/ED2/ED/src/include -I/opt/local/include   /Users/manfredo/Desktop/ED2/ED/build//ed_2.1-opt.a -L/opt/local/lib -lhdf5 -lhdf5_fortran -lz -L/opt/local/lib/libgcc/ -lstdc++ -lm   \
           -O0 -ffixed-line-length-none
    Undefined symbols for architecture x86_64:
      "_calchydrosubsurface_", referenced from:
          _ed_model_ in ed_2.1-opt.a(ed_model.o)
      "_calchydrosurface_", referenced from:
          _ed_model_ in ed_2.1-opt.a(ed_model.o)
      "_canopy_photosynthesis_", referenced from:
          ___rk4_driver_MOD_rk4_timestep in ed_2.1-opt.a(rk4_driver.o)


    !!!all other similar errors!!!


    "_writehydro_", referenced from:
          _ed_model_ in ed_2.1-opt.a(ed_model.o)
    ld: symbol(s) not found for architecture x86_64
    collect2: error: ld returned 1 exit status
    make[1]: *** [/Users/manfredo/Desktop/ED2/ED/build//ed_2.1-opt] Error 1
    make: *** [all] Error 2

谢谢

【问题讨论】:

  • 我已经阅读了几乎所有关于此类错误的页面:我绝对确定你没有,因为对于像你这样的链接器问题肯定有成千上万的答案单独的 StackOverflow。此外,您的进取心会降低人们愿意帮助您的可能性。

标签: gcc makefile fortran gfortran


【解决方案1】:

这是一个链接器错误。您似乎没有链接到包含_calchydrosubsurface_ 的 .o 文件或库。在不知道您使用的源代码或库的情况下,很难为您提供帮助,但只能告诉您要查找的内容:

搜索包含calchydrosubsurface的源代码或库;找到后,请确保正确导出符号 (nm &lt;object file&gt;),并确保在 make 文件中链接到该符号。

【讨论】:

  • nm -u ed_model.o 给了我所有未定义符号的列表,其中有 _calchydrosubsurface_ 和许多其他符号。如何检查符号是否正确导出?
  • 事实上,子程序包含在一个名为 lsm_hyd.f90 的文件中,看起来不错。该文件的编译似乎是正确的,并生成了一个 .o 文件。然后如果我输入nm -u lsm_hyd.o 我会读到0000000000007141 T ___lsm_hyd_MOD_calchydrosubsurface
  • T 是个好兆头。但是,___lsm_hyd_MOD_calchydrosubsurface != _calchydrosubsurface_。我真的不知道如何从这里进一步进步——gfortran 链接一直有点特别。
  • 在我看来有点像例程是在模块 (lsm_hyd) 中定义的,并且调用例程没有适当的 use 语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-27
  • 2013-11-18
相关资源
最近更新 更多