我尝试用C编译需要“ math.h”的库,这是.c文件的开头:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "sparse_matrix.h"
...
然后使用以下命令进行编译:
gcc -c ./sparse_matrix.c -o sparse_matrix.o -lm -Wall -pedantic -std=c99 -g -O
但是即使在文件后面加上#include
完成标记和标志-lm
(我已经在行尾尝试过,但没有任何改变),我仍然收到错误:undefined reference to « sqrt » collect2: error: ld returned 1 exit status
搜寻了一个小时后,我没有收到。我正在Ubuntu 14.10(Utopic Unicorn)下使用gcc 4.9。预先感谢您的任何帮助!
我不认为这是您正在运行的命令(嗯,它可能是其中之一,但肯定不是导致您出错的命令)。
告诉它仅创建目标文件的-c
选项gcc
(并且您专门将输出发送到sparse_matrix.o
对象文件,而不是可执行文件)。
在这种情况下,根本不应该调用链接器。
实际上,带有以下sparse_matrix.c
项:
#include <math.h>
int main(void) {
return (int)(sqrt(16.0));
}
您的命令运行正常,当我完成以下过程时:
pax> gcc -o sparse_matrix sparse_matrix.o -lm
pax> ./sparse_matrix
pax> echo $?
4
您会看到它也可以正常运行。
可能是您-lm
没有在实际的链接阶段留下链接器标志(例如),这会导致此问题。它们对编译阶段没有影响(除非它们同时影响编译和链接阶段,但-l
不是其中之一)。
而且,通过“离开”,我还包括了“错位”的可能性。有些接头是定位在他们处理的,如果他们满足未定义的符号,他们将只提取库的对象库的方式在他们列出的点在哪里。
因此,命令:
linker sparse_matrix.o -lm ...
之所以.o
有效sqrt
,是因为该文件引入了不满意的引用,对此感到满意libm
。如果链接器是位置链接器,则:
linker -lm sparse_matrix.o ...
之所以不起作用,是因为在处理时libm
,没有不满意的符号,因此没有提取任何内容。sqrt
然后在该点之后引入对undefined的引用,并且没有其他对象或库可以满足它。
无论是ld
或gcc
连接器阶段有一个限制,我不知道,我只是提高的可能性的东西需要提防。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句