Linux:未定义的“睡眠”引用,即使我包含了unistd.h

时间:2018-05-01 20:49:17

标签: c linux ubuntu

尝试使用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):指向其他问题的链接对我没有帮助。这就是我发新帖子的原因。我不在窗户上!!

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版本,或者找到一种不同的方式来暂停您的计划。