对已链接的函数的未定义引用
undefined reference to a function, which has already been linked
我正在制作一个名为 reporter 的 C 程序,这里是 include:
#include <lcthw/dbg.h>
#include <lcthw/stats.h>
#include <stdio.h>
#include <math.h>
这是问题发生的地方:
Stats_dump(stats);
Stats_dump
in Stats.c(实现文件):
void Stats_dump(Stats *st){
fprintf(stderr,"sum : %f, sumsq %f, n: %ld,min:%f, max: %f,mean: %f, stddev: %f",
st->sum,st->sumsq,st->n,st->min,st->max,Stats_mean(st),Stats_stddev(st));}
导致Stats_stddev中的错误Stats.h:
static inline double Stats_stddev(Stats *st){
return sqrt((st->sumsq-st->sum*st->sum/st->n)/(st->n-1)); // potential error?
}
当我 运行 makefile 中的这一行时(build/libYOURLIBRARY.a 是我存储自制库的地方,如统计信息):
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -fPIC reporter.c -lm build/libYOURLIBRARY.a -o reporter
然而,returns:
build/libYOURLIBRARY.a(stats.o): In function `Stats_stddev':
/media/thang/DATA/gay/liblcthw/src/lcthw/stats.h:17: undefined reference to `sqrt'
我在每个文件中都包含 math.h,并且还在 makefile 的每一行中添加 -lm,但无济于事。
可能是什么原因导致了这个问题,如何解决这个问题?
一些链接器往往是相当简单的野兽。当他们在命令行上遇到 -lsomething
时,他们使用它来满足任何 当前 未解析的符号。
引入一个新的未解析符号(例如您的build/libYOURLIBRARY.a
)可能不会导致它备份并再次尝试前面提到的库。
在您的特定情况下,只需将 -lm
移动到 之后 您的存档文件即可解决此问题:
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -fPIC reporter.c build/libYOURLIBRARY.a -lm -o reporter
这样,当您开始查看数学库时,就会知道未解析的符号,因此它会解析它。
我正在制作一个名为 reporter 的 C 程序,这里是 include:
#include <lcthw/dbg.h>
#include <lcthw/stats.h>
#include <stdio.h>
#include <math.h>
这是问题发生的地方:
Stats_dump(stats);
Stats_dump
in Stats.c(实现文件):
void Stats_dump(Stats *st){
fprintf(stderr,"sum : %f, sumsq %f, n: %ld,min:%f, max: %f,mean: %f, stddev: %f",
st->sum,st->sumsq,st->n,st->min,st->max,Stats_mean(st),Stats_stddev(st));}
导致Stats_stddev中的错误Stats.h:
static inline double Stats_stddev(Stats *st){
return sqrt((st->sumsq-st->sum*st->sum/st->n)/(st->n-1)); // potential error?
}
当我 运行 makefile 中的这一行时(build/libYOURLIBRARY.a 是我存储自制库的地方,如统计信息):
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -fPIC reporter.c -lm build/libYOURLIBRARY.a -o reporter
然而,returns:
build/libYOURLIBRARY.a(stats.o): In function `Stats_stddev':
/media/thang/DATA/gay/liblcthw/src/lcthw/stats.h:17: undefined reference to `sqrt'
我在每个文件中都包含 math.h,并且还在 makefile 的每一行中添加 -lm,但无济于事。
可能是什么原因导致了这个问题,如何解决这个问题?
一些链接器往往是相当简单的野兽。当他们在命令行上遇到 -lsomething
时,他们使用它来满足任何 当前 未解析的符号。
引入一个新的未解析符号(例如您的build/libYOURLIBRARY.a
)可能不会导致它备份并再次尝试前面提到的库。
在您的特定情况下,只需将 -lm
移动到 之后 您的存档文件即可解决此问题:
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -fPIC reporter.c build/libYOURLIBRARY.a -lm -o reporter
这样,当您开始查看数学库时,就会知道未解析的符号,因此它会解析它。