首页 > 解决方案 > 架构 x86_64 问题的 Xcode 未定义符号

问题描述

我正在尝试使用 Xcode 在我的 Mac 上运行 C 书籍中的代码,但编译时遇到问题

我有一个带有文件结构的头文件和一个缓冲区,但是当我尝试使用缓冲区变量时,方法实现出现错误。

我的标题看起来是这样的

#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”,引用自:custio.o ld中的_cfopen:未找到架构x86_64 clang的符号:错误:链接器命令失败,退出代码为1(使用-v查看调用)

标签: cxcodegccclang

解决方案


推荐阅读