【问题标题】:-lm doesnt work unless it's at the end of the command [duplicate]-lm 不起作用,除非它在命令的末尾[重复]
【发布时间】:2018-03-25 03:18:59
【问题描述】:

我目前正在编写一个用于 uni 评估的程序,并且他们有一个固定的行来编译它,所以如果它不能正常工作,它将不会被接受。 他们使用的命令是

gcc -Wall -ansi -lm program.c -o program.out

我的程序不会这样编译,它会给我一个未定义的引用错误(使用 math.h 库引用我的 log10) 如果我使用:

gcc -Wall -ansi program.c -o program.out -lm

有效

我的问题可能是什么?

我使用的是 windows 10 64bit 并安装了 windows bash 和 gcc。

【问题讨论】:

  • gcc 编译器的版本是多少?
  • 这与 GCC 的行为一致,至少,对我来说,它只会将任何给定编译单元(例如,从 program.c 创建的目标文件)中的名称解析为稍后的地址编译单元(如libm.a,或者在Windows 上是m.lib?)。所以我很惊讶你的大学期望编译在源文件之前使用-lm
  • 我正在使用 gcc 5.4.0!是的,虽然我也一样,但我不知道该怎么做.. 除非有一些工作可以让它工作!
  • @DavidZ:这不是它的工作原理——库是按顺序解析的,但目标文件不是。

标签: c gcc math.h


【解决方案1】:

如果您的讲师使用的是 gold,而您使用的是 GNU ld,则会对此进行解释。这是两个链接器,都是 GNU 项目的一部分,并且都与 GCC 一起使用。

如果您使用的是 GNU ld,您会得到“传统”行为:

指定 -L 和 -l 选项的顺序,以及指定 -l 选项相对于路径名操作数的顺序很重要。

这意味着您必须将-lm 放在任何依赖它的目标文件和库之后。

但是,如果您使用的是黄金,-l 选项可能会首先出现。

如果你的系统上安装了黄金,你可以自己测试一下。

这是我得到的:

$ gcc -lm program.c 
/tmp/ccJmBjmd.o: In function `main':
program.c:(.text+0x15): undefined reference to `sin'
collect2: error: ld returned 1 exit status

但如果我使用黄金,它可以正常工作:

$ gcc -lm program.c -fuse-ld=gold

【讨论】:

    【解决方案2】:

    -lm 需要在命令的末尾,很可能在第一种情况下,编译器正在优化对任何 function 的调用,因此不需要链接到库。这称为constant folding,例如我们可以在Other Built-in Functions Provided by GCC 上的gcc 文档中看到:

    GCC 包括许多函数的内置版本 标准 C 库。以 __builtin_ 为前缀的版本总是 被视为与 C 库函数具有相同的含义,即使 您指定 -fno-builtin 选项。 (参见 C 方言选项)许多 这些功能仅在某些情况下进行了优化; 如果不是 在特定情况下进行了优化,对库函数的调用是 发出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2023-02-11
      • 2017-09-11
      • 2019-11-09
      • 2013-08-21
      • 2012-05-13
      相关资源
      最近更新 更多