2013-01-19 90 views
0

当我有以下生成文件:未定义参考`dgesv_”编译

CC = gcc 

ROOTPATH = /home/swagatam 
LIB_PATH = $(ROOTPATH)/mylib/libf2c.a \ 
      $(ROOTPATH)/mylib/blas_LINUX.a \ 
     $(ROOTPATH)/mylib/lapack_LINUX.a -lm 


INC_PATH = -I$(ROOTPATH)/myinclude 

swadgesv : swadgesv.o 
    $(CC) $(LIB_PATH) swadgesv.o -o swadgesv 

swadgesv.o : swadgesv.c 
    $(CC) $(INC_PATH) -c swadgesv.c 

clean: 
    rm -f *.o 

swadgesv.c是解决方案的形式AX = B的方程我需要3的头文件和3米的库链接到解决概率。但是,当我在终端中运行的Makefile它表明:

gcc -I/home/swagatam/myinclude -c swadgesv.c 
gcc /home/swagatam/mylib/libf2c.a /home/swagatam/mylib/blas_LINUX.a   /home/swagatam/mylib/lapack_LINUX.a -lm swadgesv.o -o swadgesv 
swadgesv.o: In function `main': 
swadgesv.c:(.text+0x0): multiple definition of `main' 
/home/swagatam/mylib/libf2c.a(main.o):(.text.startup+0x0): first defined here 
/home/swagatam/mylib/libf2c.a(main.o): In function `main': 
(.text.startup+0xad): undefined reference to `MAIN__' 
swadgesv.o: In function `main': 
swadgesv.c:(.text+0xc1): undefined reference to `dgesv_' 
collect2: ld returned 1 exit status 
make: *** [swadgesv] Error 1 

即使我改变LIB_PATH库的顺序它显示了不同的错误。我从我安装的clapack库调用函数dgsev。

回答

6

把你的库对象文件后:

swadgesv: swadgesv.o 
    $(CC) swadgesv.o -o swadgesv $(LIB_PATH) 

如果先列出库,装载机正在寻找一个符号main(),它通常不会发现它在一个库中,所以它有没有理由链接图书馆的任何符号,并有效地忽略它们。当它最终遇到您的目标文件时,它会找到main(),但在对象文件之后的(不存在的)参数中找不到main()引用的符号。因此符号保持不确定。链接行上参数的顺序很重要。

+0

@ Jonathan Leffler:非常感谢。我很感激。它终于奏效了。我不知道排序会如此重要。 – swagatam