c - Fedora 中的 GCC math.h 与 Ubuntu 的比较

标签 c ubuntu gcc fedora

我在我的一个 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 也是如此。顺便说一句,-o a.out只是一个无操作,因为a.out是当-o`选项不存在时的默认名称。

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

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

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

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

关于c - Fedora 中的 GCC math.h 与 Ubuntu 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31692353/

相关文章:

linux - Libc的静态链接

c - 今天和 20 年前的内存对齐

c - msgsnd 无权限错误

c - 1000 以下的所有 3 或 5 的倍数之和在 C 中给出错误答案

linux - 无法运行测试 node.js http 脚本 : connection not found

c - 了解取消引用未初始化指针的 C 的未优化 asm,导致段错误

c - 使用openmp没有结果

c - 函数指针

php -v 总是返回 php@5.6

python - Ubuntu 和 Matplotlib