我正在制作一个名为reporter的C程序,其中包括:
#include <lcthw/dbg.h>
#include <lcthw/stats.h>
#include <stdio.h>
#include <math.h>
这是发生问题的地方:
Stats_dump(stats);
Stats.c(实现文件)中的[Stats_dump
:
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.h中Stats_stddev中的错误:
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
但是,它返回:
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
的符号]可能会[[not使其备份并再次尝试上述库。]]在您的特定情况下,可能只需将-lm
移到存档文件的[[after
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -fPIC reporter.c build/libYOURLIBRARY.a -lm -o reporter