【问题标题】:Undefined reference to log10? [duplicate]未定义对 log10 的引用? [复制]
【发布时间】:2020-10-24 15:06:46
【问题描述】:

我有以下两个函数,编译时遇到标题错误。

double getIdf(FileList fl, int D){
  double fileCount = countFiles(fl); //todo countfiles
  double temp = fileCount/D;
  double idf = log10(temp);
  return (fabs(idf));
}

double countFiles(FileList fl){
    if (fl == NULL){
        printf("countFiles FL does not exist\n");
        return 0;
    }
    double count = 0;
    FileList curr = fl;
    while (curr != NULL) {
        count++;
        curr = curr->next;
    }
    return count;
}

但是,如果我将 log10 函数更改为 log10(5.5) 它将起作用。

double getIdf(FileList fl, int D){
  double fileCount = countFiles(fl); //todo countfiles
  double temp = fileCount/D;
  double idf = log10(5.5);
  return (fabs(idf));
}

我正在使用 -lm 进行编译。

这里有什么问题?

【问题讨论】:

  • 发布您用于链接的确切命令行。如果是gcc -lm foo.c,那是你的问题; -lm 需要放在最后。见stackoverflow.com/questions/45135/…
  • 你修改后的版本不同可能是当参数为常量时,编译器可以在编译时计算log10(5.5),根本不需要调用库函数。
  • 可能缺少一些包含文件? (至少从您发布的代码中)
  • @NateEldredge 是的,将 -lm 移动到最后有效。这是为什么?如何更改代码以便不必将 -lm 移到后面进行编译?
  • 阅读我之前评论中的链接。

标签: c math math.h


【解决方案1】:

你输入了

gcc -lm program.c

你想要

gcc program.c -lm

因为库只提取已被链接的代码所引用的符号,并且您在添加任何代码之前尝试在库中进行链接。

我知道,这很糟糕。如果它可以索引库并使用它们来引用库加载后才需要的符号,那就更好了。我不得不两次引用库。

【讨论】:

  • 有没有办法在前面加上-lm编译?我正在做一个将通过自动测试的大学项目。自动测试程序将在前面使用 -lm 进行编译...
  • @REDBEAN:自动测试程序不应该这样做,除非它运行在链接器扫描所有库的平台上。有关测试环境的更多详细信息会很有用(作为对您的问题的编辑,而不是作为此处的评论)
猜你喜欢
  • 2015-10-02
  • 2022-01-05
  • 2015-10-09
  • 2017-03-31
  • 2021-11-12
  • 1970-01-01
  • 2011-07-27
  • 2013-06-20
  • 2012-02-05
相关资源
最近更新 更多