我正在尝试编译COSEG,这是来自Xubuntu上的RepeatMasker开发人员的程序(链接:http://www.repeatmasker.org/COSEGDownload.html)。
解压缩发行版后,我进入目录并尝试在终端中运行make
,但出现许多“未定义引用”错误:
massimiliano@compaq2:~/Programs/coseg$ make
cc -O4 -lm version.o coseg.o -o coseg
coseg.o: In function `compute_siegel_tri_pvalue.part.0':
coseg.c:(.text+0xa1): undefined reference to `log'
coseg.c:(.text+0xae): undefined reference to `exp'
coseg.c:(.text+0x47b): undefined reference to `log'
coseg.c:(.text+0x4c2): undefined reference to `exp'
coseg.c:(.text+0x4d7): undefined reference to `log'
coseg.c:(.text+0x683): undefined reference to `log'
coseg.c:(.text+0x6d7): undefined reference to `exp'
coseg.c:(.text+0x6e4): undefined reference to `log'
coseg.c:(.text+0x70f): undefined reference to `sqrt'
coseg.c:(.text+0x72d): undefined reference to `sqrt'
coseg.c:(.text+0x757): undefined reference to `sqrt'
coseg.o: In function `compute_siegel_pvalue.part.1':
coseg.c:(.text+0x7da): undefined reference to `log'
coseg.c:(.text+0x7e7): undefined reference to `exp'
coseg.c:(.text+0x97f): undefined reference to `exp'
coseg.c:(.text+0x98c): undefined reference to `log'
coseg.c:(.text+0x9ff): undefined reference to `log'
coseg.c:(.text+0xad7): undefined reference to `exp'
coseg.c:(.text+0xae4): undefined reference to `log'
coseg.c:(.text+0xb4d): undefined reference to `log'
coseg.c:(.text+0xbe7): undefined reference to `sqrt'
coseg.c:(.text+0xc05): undefined reference to `sqrt'
coseg.o: In function `compute_pvalue.part.2':
coseg.c:(.text+0xd3b): undefined reference to `log'
coseg.c:(.text+0xd4c): undefined reference to `log'
coseg.c:(.text+0xe24): undefined reference to `exp'
coseg.c:(.text+0xe86): undefined reference to `log'
coseg.c:(.text+0xe97): undefined reference to `log'
coseg.o: In function `compute_tri_pvalue.part.3':
coseg.c:(.text+0x10e4): undefined reference to `exp'
coseg.o: In function `inverseNormalCDF':
coseg.c:(.text+0x141e): undefined reference to `log'
coseg.c:(.text+0x150f): undefined reference to `sqrt'
coseg.o: In function `allocate_memory':
coseg.c:(.text+0x15de): undefined reference to `log'
coseg.c:(.text+0x166c): undefined reference to `log'
coseg.c:(.text+0x16cc): undefined reference to `log'
coseg.o: In function `compute_tri_pvalue':
coseg.c:(.text+0x303a): undefined reference to `log'
coseg.c:(.text+0x3047): undefined reference to `exp'
coseg.o: In function `compute_pvalue':
coseg.c:(.text+0x31e6): undefined reference to `log'
coseg.c:(.text+0x31f3): undefined reference to `exp'
coseg.o: In function `compute_score':
coseg.c:(.text+0x32cd): undefined reference to `log'
coseg.c:(.text+0x32da): undefined reference to `exp'
coseg.o: In function `compute_tri_score':
coseg.c:(.text+0x3386): undefined reference to `log'
coseg.c:(.text+0x3393): undefined reference to `exp'
coseg.o: In function `compute_tri_bestmut':
coseg.c:(.text+0x628c): undefined reference to `log'
coseg.c:(.text+0x629b): undefined reference to `exp'
coseg.o: In function `split_pvaluelocal':
coseg.c:(.text+0x6e55): undefined reference to `log'
coseg.c:(.text+0x734d): undefined reference to `log'
coseg.c:(.text+0x735a): undefined reference to `exp'
coseg.o: In function `compute_bestmut':
coseg.c:(.text+0x7ff3): undefined reference to `log'
coseg.c:(.text+0x8000): undefined reference to `exp'
coseg.o: In function `union_tri_pvalue':
coseg.c:(.text+0x91fd): undefined reference to `log'
coseg.c:(.text+0x920a): undefined reference to `exp'
coseg.c:(.text+0x934e): undefined reference to `log'
coseg.c:(.text+0x935b): undefined reference to `exp'
coseg.o: In function `union_pvalue':
coseg.c:(.text+0x9e1c): undefined reference to `log'
coseg.c:(.text+0x9e29): undefined reference to `exp'
coseg.o: In function `build_MST':
coseg.c:(.text+0xb232): undefined reference to `exp'
coseg.o: In function `compute_sigma':
coseg.c:(.text+0xb7d4): undefined reference to `log'
coseg.c:(.text+0xb7e1): undefined reference to `exp'
coseg.o: In function `compute_bestmut1':
coseg.c:(.text+0xbb27): undefined reference to `log'
coseg.c:(.text+0xbb34): undefined reference to `exp'
coseg.o: In function `build_new_subfamily2':
coseg.c:(.text+0xd265): undefined reference to `exp'
coseg.c:(.text+0xd2a6): undefined reference to `log'
coseg.c:(.text+0xd4ad): undefined reference to `exp'
coseg.c:(.text+0xd4ee): undefined reference to `log'
coseg.o: In function `sigmage_to_logpvalue':
coseg.c:(.text+0xd8a8): undefined reference to `exp'
coseg.c:(.text+0xd8ec): undefined reference to `log'
coseg.o: In function `build_new_singlemut_subfamily':
coseg.c:(.text+0xdb4d): undefined reference to `exp'
coseg.c:(.text+0xdb8e): undefined reference to `log'
coseg.c:(.text+0xdd7d): undefined reference to `exp'
coseg.c:(.text+0xddbe): undefined reference to `log'
coseg.o: In function `build_singlemut_MST':
coseg.c:(.text+0xe608): undefined reference to `log'
coseg.c:(.text+0xe615): undefined reference to `exp'
coseg.c:(.text+0xe8ce): undefined reference to `log'
coseg.c:(.text+0xe8db): undefined reference to `exp'
coseg.o: In function `build_MST2':
coseg.c:(.text+0xf38f): undefined reference to `exp'
coseg.c:(.text+0xf5d0): undefined reference to `exp'
coseg.c:(.text+0xf7c9): undefined reference to `exp'
coseg.c:(.text+0xf814): undefined reference to `log'
coseg.c:(.text+0xf85f): undefined reference to `exp'
coseg.c:(.text+0xfb3c): undefined reference to `exp'
coseg.c:(.text+0xfb97): undefined reference to `log'
coseg.c:(.text+0xfbf6): undefined reference to `exp'
coseg.c:(.text+0xfcd8): undefined reference to `sqrt'
coseg.c:(.text+0xfd51): undefined reference to `sqrt'
coseg.o: In function `print_subfamilies':
coseg.c:(.text+0xffe0): undefined reference to `exp'
coseg.c:(.text+0x10024): undefined reference to `log'
collect2: ld returned 1 exit status
make: *** [coseg] Error 1
在互联网上搜索时,我发现这可能是一个“链接”问题,我必须在makefile中添加/修改一些代码行,但是这种东西对我来说是很新的,我不是程序员,所以我觉得有点困惑。
请问您有什么提示或建议可以帮助我解决此问题?
非常感谢您的宝贵时间!
马西米利亚诺。
更新:
尝试编译该程序的先前版本时,给了我一个额外的警告:
echo "char const* Version = \"0.2.1\";" > version.c
cc -O4 -lm -c -o version.o version.c
cc -O4 -lm -c -o coseg.o coseg.c
coseg.c: In function ‘inverseNormalCDF’:
coseg.c:973:5: warning: format ‘%lf’ expects a matching ‘double’ argument [-Wformat]
更新-Makefile:
这是与发行版一起打包的Makefile:
##
## Makefile for coseg project
##
VERSION=0.2.2
INSTALLDIR=/usr/local/coseg-${VERSION}
## Basic
CC = cc -O4 -lm
## A nice memory leak checker:
#CC = bgcc -O4 -fbounds-checking -lm
all: coseg
version.c: Makefile
echo "char const* Version = \"$(VERSION)\";" > version.c
coseg: version.o coseg.o
${CC} version.o coseg.o -o coseg
beautify:
indent -bap -cdb -bl -bli0 -npcs -nut -lp coseg.c
install: coseg
-mkdir ${INSTALLDIR}
cp coseg ${INSTALLDIR}
cp README ${INSTALLDIR}
cp preprocessAlignments.pl ${INSTALLDIR}
cp postprocess.pl ${INSTALLDIR}
cp runcoseg.pl ${INSTALLDIR}
cp extractSubSeqs.pl ${INSTALLDIR}
cp refineConsSeqs.pl ${INSTALLDIR}
cp ALU.cons ${INSTALLDIR}
cp ALU.ins ${INSTALLDIR}
cp ALU.seqs ${INSTALLDIR}
cp LINE1 ${INSTALLDIR}
dist:
-mkdir dist
-mkdir dist/coseg
cp ALU.cons dist/coseg
cp ALU.ins dist/coseg
cp ALU.seqs dist/coseg
cp LINE1 dist/coseg
cp Makefile dist/coseg
cp README dist/coseg
cp coseg.c dist/coseg
cp coseg.h dist/coseg
cp postprocess.pl dist/coseg
cp preprocessAlignments.pl dist/coseg
cp runcoseg.pl dist/coseg
cp extractSubSeqs.pl dist/coseg
cp refineConsSeqs.pl dist/coseg
(cd dist; tar zcvf coseg-$(VERSION).tar.gz coseg)
clean:
-rm *.o
-rm coseg
-rm version.c
-rm ALU.seqs.subfamilies.seq
-rm ALU.seqs.assign
-rm ALU.seqs.log
-rm ALU.seqs.subfamilies
-rm ALU.seqs.tree.viz
ALU.seqs.subfamilies.seq: coseg
./runcoseg.pl -d -filePrefix ALU
t/kothi.seqs.subfamilies.seq: coseg
./runcoseg.pl -u1 -t -m 5 -filePrefix t/kothi
test: ALU.seqs.subfamilies.seq t/kothi.seqs.subfamilies.seq
diff ALU.seqs.subfamilies.seq t
diff t/kothi.seqs.subfamilies.seq t/kothi-baseline
最佳答案
某些链接程序(包括您的链接程序)需要在目标文件(或其他库)之后指定库,这些库使用其中的符号。如果涉及循环依赖性,这甚至可能导致有必要指定库倍增。
在您的情况下,coseg.o
使用来自libm
的符号,因此您必须在命令coseg.o之后指定-lm
:cc -O4 version.o coseg.o -lm -o coseg
建议您将Makefile
更改为:
##
## Makefile for coseg project
##
VERSION=0.2.2
INSTALLDIR=/usr/local/coseg-${VERSION}
## Basic
CC = cc
CFLAGS = -O4
LDFLAGS = -lm
## A nice memory leak checker:
#CC = bgcc -O4 -fbounds-checking -lm
all: coseg
version.c: Makefile
echo "char const* Version = \"$(VERSION)\";" > version.c
coseg: version.o coseg.o
${CC} version.o coseg.o ${LDFLAGS} -o coseg
... rest of makefile ...
那应该解决您的问题。