与gcc和-lm链接并没有在Ubuntu上定义ceil()

dru*_*rum 15 c math.h

我目前正在使用gcc进行编译,我需要使用<math.h>.问题是它无法识别库.我也尝试过-lm,没有.我试图使用的功能是ceil(),我得到以下错误:

: undefined reference to `ceil'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我正在使用最新的Ubuntu和math.h.我尝试-lm在不同的计算机上使用它,它完美地工作.

有谁知道如何解决这个问题?


我确实包含了<math.h>.另外,我使用的命令是:

gcc -lm -o fb file.c
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 22

获取此代码并将其放在一个文件中ceil.c:

#include <math.h>
#include <stdio.h>
int main(void)
{
    printf("%f\n", ceil(1.2));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译它:

$ gcc -o ceil ceil.c
$ gcc -o ceil ceil.c -lm
Run Code Online (Sandbox Code Playgroud)

其中一个应该工作.如果两者都不起作用,则显示每个编译的完整错误消息.请注意,-lm出现在源文件的名称之后(如果在链接之前将源代码编译为对象,则显示在目标文件中).

笔记:

  1. 现代编译器可能会优化代码以直接传递2.0而printf()无需ceil()在运行时调用,因此根本不需要数学库.

  2. 经验法则:在库之前的命令行上列出对象文件和源文件.这个答案表明在使用中:-lm源文件之后ceil.c.如果你正在使用makeetc 构建,那么你通常ceil.o在命令行上使用(以及其他目标文件); 通常,您应该在任何库之前列出所有目标文件.

经验法则偶尔有例外,但它们很少见,并且会针对预期/需要例外的特定情况进行记录.如果没有相反的明确文件,则应用经验法则.


Dan*_*und 9

没有足够的声誉评论@Jonathan Leffler的回答.只是想提一下Peter van der Linden的书" Expert C Programming"在第5章"链接思考"中对这个主题有一个很好的处理.

归档(静态库)的作用与共享对象(动态库)不同.对于动态库,所有库符号都会进入输出文件的虚拟地址空间,并且所有符号都可用于链接中的所有其他文件.相反,静态链接仅通过存档查找存档处理时加载程序当前已知的未定义符号.

如果在目标文件之前指定数学库(通常是静态数学库),则链接器将不添加任何符号.


小智 6

尝试这样编译:

gcc -Wall -g file.c -lm -o file
Run Code Online (Sandbox Code Playgroud)

我遇到了同样的问题,使用这个命令解决了。此外,如果您在遇到问题的同一天安装了 Ubuntu,则可能是更新问题。

  • 这个问题早就有答案了。 (2认同)