我在我的一个 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/