Xcode неопределенные символы для архитектуры x86_64 проблема - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь запустить код из книги C на моем Mac с помощью Xcode, но у меня возникает проблема при компиляции

У меня есть заголовочный файл со структурой для файлов и буфер для него, но яОшибка при реализации метода при попытке использовать буферную переменную.

Мой заголовок выглядит следующим образом

#ifndef custio_h
#define custio_h
#include <fcntl.h>
#include <unistd.h>

#define     EOF (-1)
#define     BUFSIZ 1024
#define     OPEN_MAX 20 /* max #files open at once */

typedef struct _iobuf {
    int cnt;        /* characters left */
    char *ptr;      /* next character position */
    char *base;     /* location of buffer */
    int flag;       /* mode of file access */
    int fd;         /* file descriptor */
} FILE;

extern FILE _iob[OPEN_MAX];

#define stdin   (&_iob[0])
#define stdout  (&_iob[1])
#define stderr  (&_iob[2])

enum _flags {
    _READ   = 01,   /* file open for reading */
    _WRITE  = 02,   /* file open for writing */
    _UNBUF  = 04,   /* file is unbuffered */
    _EOF    = 010,  /* EOF has ocurred on this file */
    _ERR    = 020   /* error ocurred on this file */
};

int _fillbuf(FILE *);
int _flushbuf(int, FILE *);
FILE *cfopen(char *, char *);

#define feof(p)     (((p)->flag & _EOF) != 0)
#define ferror(p)   (((p)->flag & _ERR) != 0)
#define fileno(p)   ((p)->fd)

#define getc(p)     (--(p)->cnt >= 0 ? (unsigned char) *(p)->ptr++ : _fillbuf(p))
#define putc(x,p)   (--(p)->cnt >= 0 ? *(p)->ptr++ = (x) : _flushbuf((x),p))

#define getchar()   getc(stdin)
#define puchar(x)   putc((x), stdout)



#endif /* custio_h */

И моя реализация выглядит так:

#include "custio.h"
#define PERMS 0666

/* fopen: open file, return file pointer */
FILE *cfopen(char *name, char *mode)
{
    int fd;
    FILE *fp;

    if (*mode != 'r' && *mode != 'w' && *mode != 'a')
        return NULL;

    for (fp = _iob; fp < (_iob + OPEN_MAX); fp++)
        if ((fp->flag & (_READ | _WRITE)) == 0)
            break; /* found free slot */

    if (fp >= _iob + OPEN_MAX) /* no free slots */
        return NULL;

    if (*mode == 'w')
        fd = creat(name, PERMS);
    else if (*mode == 'a') {
        if ((fd = open(name, O_WRONLY, 0)) == -1)
            fd = creat(name, PERMS);
        long c = 10000000;
        lseek(fd, c, 2);
    } else
        fd = open(name, O_RDONLY, 0);

    if (fd == 1) /* could not access name */
        return NULL;

    fp->fd = fd;
    fp->cnt = 0;
    fp->base = NULL;
    fp->flag = (*mode == 'r') ? _READ : _WRITE;

    return fp;
}

Строки, в которых я использую _iob, являются проблемой.

ошибка говорит: неопределенные символы для архитектуры x86_64: "__iob", на которые ссылается: _cfopen в custio.o ld: символ (ы) не найден для архитектуры x86_64clang: error: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова)

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