Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对“dgesv'”的未定义引用;编译时_C_Makefile - Fatal编程技术网

C 对“dgesv'”的未定义引用;编译时

C 对“dgesv'”的未定义引用;编译时,c,makefile,C,Makefile,我有以下生成文件: 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) $(LI

我有以下生成文件:

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是一个求解A.X=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_路径中库的顺序,它也会显示不同的错误。我正在从我安装的clapack库调用函数dgsev。

将库放在目标文件之后:

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

如果您首先列出库,则加载程序正在查找符号
main()
,并且通常在库中找不到该符号,因此它没有理由链接库中的任何符号并有效地忽略它们。当它最终遇到您的对象文件时,它会找到
main()
,但在对象文件后面的(不存在的)参数中找不到
main()
引用的符号。因此,符号仍然没有定义。链接行上参数的顺序很重要。

将库放在对象文件之后:

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

如果您首先列出库,则加载程序正在查找符号
main()
,并且通常在库中找不到该符号,因此它没有理由链接库中的任何符号并有效地忽略它们。当它最终遇到您的对象文件时,它会找到
main()
,但在对象文件后面的(不存在的)参数中找不到
main()
引用的符号。因此,符号仍然没有定义。链接行上的参数顺序很重要。

@Jonathan Leffler:非常感谢。我真的很感激。终于成功了。我不知道订货会这么重要。@乔纳森·莱夫勒:非常感谢。我真的很感激。终于成功了。我不知道订货会这么重要。