尝试使用sleep()
暂时暂停我的程序。
除非我“制作”我得到undefined reference to sleep
,即使我在#include <unistd.h>
位于顶部。
In function `main': [...]/source/ball.c:232: undefined reference to `sleep' [...]/source/ball.c:240: undefined reference to `sleep' collect2: error: ld returned 1 exit status
我正在使用linux。 有什么建议? 感谢
编辑:这不是一个重复的问题,因为每次问这个问题时,用户都在Windows上运行它。解决方案。对我来说,不仅仅是包含Windows标题。
编辑(2):指向其他问题的链接对我没有帮助。这就是我发新帖子的原因。我不在窗户上!!
答案 0 :(得分:1)
这是一个链接器错误,而不是编译器错误(你可以看到&#34; ld返回1退出状态&#34; part-ld是链接器)。所以睡眠是在标题中声明的,编译很好,但你需要确保为链接阶段包含正确的库/二进制文件。
答案 1 :(得分:1)
我可以使用以下程序大致复制报告的行为:
#include <unistd.h>
int main (void) {
sleep(1);
return 0;
}
void _start (void) {
asm("call main;"
"mov %eax,%ebx;"
"movl $1,%eax;"
"int $0x80;");
}
但是,必须使用-nostdlib
进行编译。从这个TIO示例中,我得到:
/tmp/ccfjKQV4.o: In function `main': .code.tio.c:(.text+0xa): undefined reference to `sleep' collect2: error: ld returned 1 exit status
这与您报告的输出非常匹配。要解决此问题,您需要在链接程序时提供libc
。这可以通过添加-lc
来完成,如此TIO示例所示。但是,如果您使用-nostdlib
,此解决方案可能不可行(稍后会详细介绍)。
_start
我提供的示例程序是如何创建x86 linux程序的示例,该程序将调用main
然后调用exit
而无需使用C运行时。如果没有标准的C运行时,linux将尝试跳转到名为_start
的例程。由于没有C库,因此通过汇编调用exit
。
-nostdlib
-nostdlib
选项告诉编译器在构建可执行文件时不包含标准C运行时和C库。这有时用于嵌入式软件开发,其中嵌入式平台具有自己的运行时。如果此软件旨在在嵌入式平台上运行,则将-lc
包含在链接线中可能是错误的,因为它可能会干扰嵌入式系统的库。在这种情况下,您可能需要实现自己的sleep
版本,或者找到一种不同的方式来暂停您的计划。