我正在尝试编译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之后指定-lmcc -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 ...


那应该解决您的问题。

10-06 15:09