Ошибки с gcc при компиляции программы на C - PullRequest
1 голос
/ 21 сентября 2010

У меня есть специальная программа оболочки, в которую я включил signal.h, unistd.h и stdio.h. Первоначально я работал над этим в RedHat Enterprise (точно не знаю, какая версия, но не слишком старая), и я смог использовать gcc в своей программе, и он прекрасно скомпилировался и работал нормально. Теперь я перенес его в Ubuntu, и gcc выдает мне несколько ошибок, первая из которых conflicting types for 'getline()'. Некоторые другие ошибки говорят incompatible implicit declaration of built-in function strlen. Я переопределил функции, о которых идет речь, почему это работало в RedHat, а не в Ubuntu? Linux это не мое, поэтому, пожалуйста, говорите прямо. Дайте мне знать, если вам нужно больше подробностей об ошибке.

/* define a global input buffer */
#include <signal.h>
#include <unistd.h>
#include <stdio.h>

#define MAXARG 512
#define MAXBUF 512
#define BUFFER_SIZE 50
#define MAX_COMMANDS 10
char buffer [BUFFER_SIZE];
static char *prompt = "MYSHELL>";
static char inpbuf[MAXBUF];
static char *arg[MAXARG+1];
static char tokbuf[2*MAXBUF];
static char *tok = tokbuf;
char history[MAX_COMMANDS][MAXBUF];
int cmd_num;

void getline(void);

void getline() {
int length;

length = read(0, inpbuf, MAXBUF);
if (length == 0) {
    printf("\n");
    exit(0);
}
inpbuf[length] = '\0';

}

void processline() {
char *ptr = inpbuf;
int narg;
for (narg=0;;) {    
    arg[narg] = tok;
    for (; *ptr == ' ' || *ptr == '\t'; ptr++)
        ;
    while(*ptr != ' ' && *ptr != '\t' && *ptr != '\n' && 
          *ptr != '\0' && *ptr != ';' && *ptr != '&') 
        *tok++ = *ptr++;
    *tok++ = '\0';
    if (narg < MAXARG)
        narg++;
    if (*ptr == '\n')
        break;
}
// clear the input buffer
for (ptr = inpbuf; *ptr != '\n'; ptr++)
    *ptr = ' ';
if (narg != 0) {
    arg[narg] = NULL;
}
}

void handle_SIGINT()
{
write(STDOUT_FILENO, buffer, strlen(buffer));
}

int main()
{
    int pid, exitstat, ret;
    struct sigaction handler;
    handler.sa_handler = handle_SIGINT;
    handler.sa_flags = 0;
    sigemptyset(&handler.sa_mask);
    sigaction(SIGINT, &handler, NULL);
    strcpy(buffer, "Caught Control C\n");

    while (1) {
        printf("%s ", prompt);
        fflush(stdout);
        getline();
        processline();
        if ((pid = fork()) < 0){
            fprintf(stderr, "myshell: error\n");
            return (-1);
        }

        if (pid == 0) {
            execvp(*arg, arg);
            fprintf(stderr, "%s\n", *arg);
            exit(127);
        }
        waitpid(pid, &exitstat, 0);
    }
    return 0;
}

Ответы [ 4 ]

4 голосов
/ 21 сентября 2010

Самое простое решение - переименовать вашу функцию getline(), например, до my_getline()

4 голосов
/ 21 сентября 2010

incompatible implicit declaration of built-in function strlen

Включить <string.h>

conflicting types for 'getline()

<stdio.h> уже содержит объявление getline, поэтому убедитесь, что нигде в вашем коде вы не объявили / переопределили getline() [с другим прототипом].

0 голосов
/ 24 августа 2016

Getline() не является частью стандарта C. Это расширение GNU. В с ++ Getline() стандартно.

Так что добавление в ваш код прямо перед тем, как ваш # включает

#define _GNU_SOURCE

должно исправить предупреждение. Также смотрите "man getline" в linux.

0 голосов
/ 21 сентября 2010
gcc -Wall typoknig.c
typoknig.c:19: error: conflicting types for ‘getline’
//usr/include/stdio.h:671: note: previous declaration of ‘getline’ was here
typoknig.c:21: error: conflicting types for ‘getline’
//usr/include/stdio.h:671: note: previous declaration of ‘getline’ was here

Два отдельных объявления getline, которые Энди рекомендовал использовать my_getline(), так как первое уже является частью stdio.h.

typoknig.c: In function 'getline ':
typoknig.c: 27: предупреждение: неявное объявление функции' exit '
typoknig.c: 27: предупреждение: несовместимое неявное объявление встроенной функции' exit '

Это не может быть хорошо, man exit говорит прямо вверху:

#include <stdlib.h>
void exit(int status);

возможно, вам нужно включить stdlib.h?Что gcc предполагает, что это подпись необъявленной функции?

typoknig.c: В функции 'handle_SIGINT':
typoknig.c: 59: предупреждение: неявное объявление функции 'strlen'
typoknig.c: 59: предупреждение: несовместимое неявное объявление встроенной функции 'strlen'

Ой, man strlen на помощь:

#include <string.h>

К счастью,string.h поможет со следующим, и мы уже прибили exit:

typoknig.c: В функции 'main':
typoknig.c: 70: предупреждение: неявное объявлениефункции 'strcpy'
typoknig.c: 70: предупреждение: несовместимое неявное объявление встроенной функции 'strcpy'
typoknig.c: 85: предупреждение: несовместимое неявное объявление встроенной функции 'exit'

Разве это не изящный препроцессор?

typoknig.c:87: warning: implicit declaration of function ‘waitpid’
typoknig.c:64: warning: unused variable ‘ret’

Sayeth man waitpid:

#include <sys/types.h>
#include <sys/wait.h>

Строка 64 оставлена ​​в качестве упражнения для читателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...