对一个函数的未定义引用,该函数已被链接[重复]

问题描述 投票:1回答:1

我正在制作一个名为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,但无济于事。

什么可能导致了此问题,以及如何解决此问题?

c makefile math.h
1个回答
3
投票

某些链接器往往是非常简单的野兽。当他们在命令行上遇到-lsomething时,他们将使用它来满足任何当前未解析的符号。

[引入新的未解析符号(例如带有build/libYOURLIBRARY.a的符号]可能会[[not使其备份并再次尝试上述库。]]在您的特定情况下,可能只需将-lm移到存档文件的[[after

中即可解决:

cc -g -O2 -Wall -Wextra -Isrc -rdynamic -fPIC reporter.c build/libYOURLIBRARY.a -lm -o reporter

这样,当您开始查看数学库时,未解析的符号就会知道,因此它将解析它。
© www.soinside.com 2019 - 2024. All rights reserved.