在编译代码时,我收到 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 头文件。
答案 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
库。