使用cfitsio库编译代码时未定义的引用

时间:2016-07-18 20:28:16

标签: c gcc makefile libraries undefined-reference

在编译代码时,我收到 cfitsio 库中使用的每个函数的未定义引用错误。下面是 make null 命令输出的相关块(注意 -L / usr / lib / -lcfitsio 在第一行):

Apple LLVM version 7.0.2 (clang-700.1.81)

以下是Makefile中 make null

的相关行
gcc -g -I../mdl/null   -DCHABRIER -DCHANGESOFT -DDENSITYU -DDENSITYUNOTP -DDIFFUSION -DDODVDS -DDTADJUST -DEPSACCH -DPARTICLESPLIT -DPROMOTE -DGASOLINE -DJEANSSOFT -DNSMOOTHINNER -DRTFORCE -DSETTRAPFPE -DSTARFORM -DTHERMALCOND -DTOPHATFEEDBACK -DTWOPHASE -DVSIGVISC -DWENDLAND -DRADIATION -DRADIATIONLUM -DDDSIMPLE -DR2PPBMAX -DCOOLING_METAL  -L/usr/lib/ -lcfitsio  -I/usr/include/fitsio.h -o gasoline.dfTest main.o master.o param.o outtype.o pkd.o pst.o grav.o ewald.o walk.o eccanom.o hypanom.o fdl.o htable.o smooth.o smoothfcn.o collision.o qqsmooth.o cooling_metal.o cosmo.o romberg.o starform.o feedback.o millerscalo.o supernova.o supernovaia.o startime.o stiff.o runge.o dumpframe.o dffuncs.o dumpvoxel.o rotbar.o special.o ssio.o   treezip.o log.o radiation.o erf.o v_sqrt1.o ../mdl/null/mdl.o -lm
dumpframe.o: In function `fitsError':
/.../dumpframe.c:2156: undefined reference to `ffrprt'
dumpframe.o: In function `dfFinishFrame':
/.../dumpframe.c:2175: undefined reference to `ffinit'
/.../dumpframe.c:2176: undefined reference to `ffcrim'
/.../dumpframe.c:2197: undefined reference to `ffppr'
/.../dumpframe.c:2198: undefined reference to `ffclos'
collect2: error: ld returned 1 exit status
Makefile:539: recipe for target 'gasoline.dfTest' failed
make[1]: *** [gasoline.dfTest] Error 1
make[1]: Leaving directory '/home/grondjj/Code/gasoline'
Makefile:457: recipe for target 'null' failed
make: *** [null] Error 2gcc -g -I../mdl/null   -DCHABRIER -DCHANGESOFT -DDENSITYU -DDENSITYUNOTP -DDIFFUSION -DDODVDS -DDTADJUST -DEPSACCH -DPARTICLESPLIT -DPROMOTE -DGASOLINE -DJEANSSOFT -DNSMOOTHINNER -DRTFORCE -DSETTRAPFPE -DSTARFORM -DTHERMALCOND -DTOPHATFEEDBACK -DTWOPHASE -DVSIGVISC -DWENDLAND -DRADIATION -DRADIATIONLUM -DDDSIMPLE -DR2PPBMAX -DCOOLING_METAL  -L/usr/lib/ -lcfitsio  -I/usr/include/fitsio.h -o gasoline.dfTest main.o master.o param.o outtype.o pkd.o pst.o grav.o ewald.o walk.o eccanom.o hypanom.o fdl.o htable.o smooth.o smoothfcn.o collision.o qqsmooth.o cooling_metal.o cosmo.o romberg.o starform.o feedback.o millerscalo.o supernova.o supernovaia.o startime.o stiff.o runge.o dumpframe.o dffuncs.o dumpvoxel.o rotbar.o special.o ssio.o   treezip.o log.o radiation.o erf.o v_sqrt1.o ../mdl/null/mdl.o -lm
dumpframe.o: In function `fitsError':
/.../dumpframe.c:2156: undefined reference to `ffrprt'
dumpframe.o: In function `dfFinishFrame':
/.../dumpframe.c:2175: undefined reference to `ffinit'
/.../dumpframe.c:2176: undefined reference to `ffcrim'
/.../dumpframe.c:2197: undefined reference to `ffppr'
/.../dumpframe.c:2198: undefined reference to `ffclos'
collect2: error: ld returned 1 exit status
Makefile:539: recipe for target 'gasoline.dfTest' failed
make[1]: *** [gasoline.dfTest] Error 1
make[1]: Leaving directory '/home/grondjj/Code/gasoline'
Makefile:457: recipe for target 'null' failed
make: *** [null] Error 2

dumpframe.c 中,我包含 cfitsio 标题 fitsio.h 以及文件顶部的其他内容:

 FITS_LIB = -L/usr/lib/ -lcfitsio

 BASE_LD_FLAGS = $(PNG_LIB) $(GSL_LIB) $(FITS_LIB)

 NULL_LD_FLAGS   = $(BASE_LD_FLAGS) 

 null:
      cd $(NULL_MDL); make "CC=$(CC)" "CFLAGS=$(NULL_CFLAGS)"
      make $(EXE) "CFLAGS=$(NULL_CFLAGS)" "LD_FLAGS=$(NULL_LD_FLAGS)"\
           "MDL=$(NULL_MDL)" "XOBJ=$(NULL_XOBJ)" "LIBMDL=$(NULL_LIBMDL)"

该库是从源代码安装的。源位于 / usr / local / src / cfitsio / ,然后通过以下命令安装:

 #ifndef GSS_DUMPFRAME
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
 #include <assert.h>
 #include <string.h>
 #include "fitsio.h"

这导致了库( libcfitsio.a libcfitsio.so libcfitsio.so.5 libcfitsio.so .5.3.39 )安装在 / usr / lib / 和辅助文件( longnam.h fitsio.h ) , fitsio2.h drvrsmem.h )安装在 / usr / include / 中。

我不确定是什么导致这种情况,因为编译器不会抱怨缺少库或缺少 fitsio.h 头文件。

1 个答案:

答案 0 :(得分:0)

将库放在目标文件之后,而不是之前。

错:

gcc -g -I../mdl/null -DCHABRIER -DCHANGESOFT -DDENSITYU -DDENSITYUNOTP \
    -DDIFFUSION -DDODVDS -DDTADJUST -DEPSACCH -DPARTICLESPLIT -DPROMOTE \
   -DGASOLINE -DJEANSSOFT -DNSMOOTHINNER -DRTFORCE -DSETTRAPFPE -DSTARFORM \
   -DTHERMALCOND -DTOPHATFEEDBACK -DTWOPHASE -DVSIGVISC -DWENDLAND -DRADIATION \
   -DRADIATIONLUM -DDDSIMPLE -DR2PPBMAX -DCOOLING_METAL \
   -L/usr/lib/ -lcfitsio  -I/usr/include/fitsio.h \
   -o gasoline.dfTest main.o master.o param.o outtype.o pkd.o pst.o grav.o ewald.o \
   walk.o eccanom.o hypanom.o fdl.o htable.o smooth.o smoothfcn.o collision.o \
   qqsmooth.o cooling_metal.o cosmo.o romberg.o starform.o feedback.o millerscalo.o \
   supernova.o supernovaia.o startime.o stiff.o runge.o dumpframe.o dffuncs.o \
   dumpvoxel.o rotbar.o special.o ssio.o treezip.o log.o radiation.o erf.o v_sqrt1.o \
   ../mdl/null/mdl.o -lm

右:

gcc -g -I../mdl/null -DCHABRIER -DCHANGESOFT -DDENSITYU -DDENSITYUNOTP \
    -DDIFFUSION -DDODVDS -DDTADJUST -DEPSACCH -DPARTICLESPLIT -DPROMOTE \
   -DGASOLINE -DJEANSSOFT -DNSMOOTHINNER -DRTFORCE -DSETTRAPFPE -DSTARFORM \
   -DTHERMALCOND -DTOPHATFEEDBACK -DTWOPHASE -DVSIGVISC -DWENDLAND -DRADIATION \
   -DRADIATIONLUM -DDDSIMPLE -DR2PPBMAX -DCOOLING_METAL \
   -o gasoline.dfTest main.o master.o param.o outtype.o pkd.o pst.o grav.o ewald.o \
   walk.o eccanom.o hypanom.o fdl.o htable.o smooth.o smoothfcn.o collision.o \
   qqsmooth.o cooling_metal.o cosmo.o romberg.o starform.o feedback.o millerscalo.o \
   supernova.o supernovaia.o startime.o stiff.o runge.o dumpframe.o dffuncs.o \
   dumpvoxel.o rotbar.o special.o ssio.o treezip.o log.o radiation.o erf.o v_sqrt1.o \
   ../mdl/null/mdl.o -lcfitsio -lm

请注意-I/usr/include/cfitsio.h选项没有用,但鉴于标题位于/usr/include,它也没有任何害处。 -I选项采用目录名称,而不是文件名。同样,-L/usr/lib选项没有任何好处,但它也没有任何害处。自动搜索/usr/lib库。