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

我目前正在使用gcc进行编译,我需要使用 。 问题是它无法识别库。 我也尝试过-lm而且没有。 我试图使用的函数是ceil() ,我得到以下错误:

 : undefined reference to `ceil' collect2: ld returned 1 exit status 

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

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


我确实包含了 。 另外,我使用的命令是:

 gcc -lm -o fb file.c 

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

 #include  #include  int main(void) { printf("%f\n", ceil(1.2)); return 0; } 

编译它:

 $ gcc -o ceil ceil.c $ gcc -o ceil ceil.c -lm 

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

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

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

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

尝试编译:

 gcc -Wall -g file.c -lm -o file 

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