2013-05-02 85 views
6

我正在使用math.h-lm选项进行编译。我已经尝试了所有的:“未定义的引用'pow'”甚至与math.h和库链接-lm

gcc -o ssf ssf_tb.c ssf.c -lm 
gcc -o ssf ssf_tb.c -lm ssf.c 
gcc -o -lm ssf -lm ssf_tb.c ssf.c 

但错误:

undefined reference to 'pow' 

发生在所有的情况下。

+0

你可以发布'ssf_tb.c'的代码吗? – higuaro 2013-05-02 17:47:36

+0

'gcc -o -lm ssf -lm ssf_tb.c ssf.c' < - 你的意思是让'-lm'两次? – Kevin 2013-05-02 17:48:15

+2

在这3条命令行中只有第一条应该起作用。你确定你试过吗? – 2013-05-02 17:48:44

回答

17

-lm放在行末。

gcc处理指定输入到最终程序的参数,它们按它们在命令行上的显示顺序排列。 -lm参数被传递给链接器,例如ssf.c参数被编译,并且生成的目标文件被传递给链接器。

链接器也按顺序处理输入。当它看到一个库时,如-lm指定,它会查看该库是否提供链接器当前需要的任何符号。如果是这样,它将使用库中的这些符号复制这些模块,并将它们构建到程序中。当链接器看到一个对象模块时,它会将该对象模块构建到程序中。在将一个对象模块带入程序之后,链接器不会回头查看它是否需要早期库中的任何内容。

由于您首先列出了库,链接器没有从库中看到它需要的任何内容。如果您首先列出目标模块,链接器会将目标模块放入程序中。在这样做的过程中,链接器将列出对象所需的所有未定义符号。然后,当链接器看到这个库时,它会看到这个库为这些符号提供了定义,并且它会将带有这些符号的模块带入程序中。

+0

感谢Eric的解释。我想我在命令的末尾使用'-lm'解决了这个问题。我不知道如何,但是我的数学库链接在'/ usr/src/mathematics/math.h'中。我重建它到/usr/include/math.h它工作! – user2344169 2013-05-02 18:18:01

+0

@ user2344169在你的文章中,你不是说你已经试过了吗? – 2015-05-15 20:34:04

+0

OP可能已经尝试过,但这是我*需要的提示,谢谢。 – 2017-03-09 12:18:06

相关问题