Fedora v/s Ubuntu 中的 GCC math.h

GCC math.h in fedora v/s Ubuntu

我在我的一个 C 程序中使用 sin 函数。

该程序在 fedora 机器上运行完美,但在 ubuntu 机器上出现引用问题

我已经使用 -lm 编译它,如下所示:

gcc -lm kepler.c -o a.out -- 在 fedora 上工作,但不在 ubuntu

上工作

gcc kepler.c -lm -o a.out -- 在 fedora 和 ubuntu

上工作
    /tmp/ccshH33a.o: In function `kepler':
    /tmp/28/kepler.c:7: undefined reference to `sin'
    collect2: error: ld returned 1 exit status

所以谁能解释一下 -lm 的位置,以及为什么它在 fedora 机器上对这两种情况都有效?

提前致谢。

gcc 像所有常见的编译器一样,内部会启动不同的程序:至少是一个编译器和一个链接器。 -lm 选项用于链接器,-o a.out. BTW,-o a.outis just a no-op sincea.outis the default name when-o` 选项不存在。

为什么 kernel.c 之前的 -lm 可能会失败:正如 Cornstalks 在评论中引用的问题 answer 中所解释的那样,链接器从左到右处理其参数,因此依赖库必须在调用它们的模块之后出现

为什么它可以在 fedora 上成功:目标模块将始终包含在可执行程序中,因此始终将它们放在传递给链接器的参数列表中的第一位是有意义的,以便链接器首先处理它们

为什么它在 Fedora 上运行而不在 Ubuntu 上运行:我认为它不是同一版本的 gcc,Fedora 上的版本更宽容。

无论如何,正确的方法是始终将依赖库放在调用它们的模块(或其他库)之后。