我目前正在为一个单一的评估编写一个程序,并且他们有一个设定线来编译它,所以如果它没有使用它,它就不会被接受。 他们命令他们使用
gcc -Wall -ansi -lm program.c -o program.out
我的程序不会以这种方式编译,并且它会给我一个未定义的referance错误(使用math.h库参考我的log10) 如果我使用:
gcc -Wall -ansi program.c -o program.out -lm
它有效
可能是我的问题?
我使用Windows 10 64bit并安装了Windows bash和gcc。
答案 0 :(得分:2)
如果你的导师使用的是黄金并且你正在使用GNU ld,这将被解释。这两个链接器都是GNU项目的一部分,两者都常用于GCC。
如果您使用的是GNU ld,那么您将获得传统的"行为:
指定-L和-l选项的顺序以及指定-l选项相对于路径名操作数的顺序非常重要。
这意味着您必须在之后放置-lm
任何依赖于它的对象文件和库。
但是,如果您使用黄金,-l
选项可能会首先出现。
如果您的系统上安装了金牌,您可以自行测试。
这是我得到的:
$ gcc -lm program.c
/tmp/ccJmBjmd.o: In function `main':
program.c:(.text+0x15): undefined reference to `sin'
collect2: error: ld returned 1 exit status
但如果我使用黄金,它可以正常工作:
$ gcc -lm program.c -fuse-ld=gold
答案 1 :(得分:0)
-lm
需要在命令的末尾,很可能在第一种情况下,文字编译器正在优化对任何function
的调用,因此不需要链接到图书馆。这称为constant folding,例如我们可以在Other Built-in Functions Provided by GCC上的gcc
文档中看到:
GCC包含了许多功能的内置版本 标准C库。始终以__builtin_为前缀的版本 被视为具有与C库函数相同的含义,即使 您指定-fno-builtin选项。 (参见C方言选项)许多 这些功能仅在某些情况下得到优化; 如果他们不是 在特定情况下优化,调用库函数是 射出。强>