Linux: неопределенная ссылка на «сон», даже если я включил unistd.h - PullRequest
0 голосов
/ 01 мая 2018

Попытка использовать 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 голосов
/ 02 мая 2018

Я могу примерно воспроизвести сообщаемое поведение с помощью следующей программы:

#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 или найти другой способ приостановить вашу программу.

0 голосов
/ 02 мая 2018

Это ошибка компоновщика, а не ошибка компилятора (вы можете видеть, что из части "ld return 1 exit status" - ld - компоновщик). Так что сон объявлен в заголовке, который прекрасно компилируется, но вы должны убедиться, что вы включили правильный библиотечный / двоичный файл для стадии связывания.

...