Pergunta

Eu tenho um aplicativo C que estou tentando compilar para o Mac OS X 10.6.4:

$ uname -v
Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386

Meu gcc é o seguinte:

$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)

Meu Makefile é o seguinte:

CC=gcc
CFLAGS=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -O3 -Wformat -Wall -pedantic -std=gnu99

all: myApp
    rm -rf *~

myApp: myApp.o
    ${CC} ${CFLAGS} myApp.o -lbz2 -o myApp
    rm -rf *~

clean:
    rm -rf *.o myApp

A questão é que meu aplicativo faz chamadas para fseeko64 e fopen64, e usa o off64_t Tipo para compensações. Quando compilar meu aplicativo, recebo os seguintes avisos e erros:

$ make myApp
gcc -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -O3 -Wformat -Wall -pedantic -std=gnu99   -c -o myApp.o myApp.c
myApp.c: In function ‘extractData’:
myApp.c:119: warning: implicit declaration of function ‘fseeko64’
myApp.c:119: error: ‘off64_t’ undeclared (first use in this function)
myApp.c:119: error: (Each undeclared identifier is reported only once
myApp.c:119: error: for each function it appears in.)
myApp.c: In function ‘extractMetadata’:
myApp.c:305: warning: implicit declaration of function ‘fopen64’
myApp.c:305: warning: assignment makes pointer from integer without a cast

Meu código aumenta sem erros no Linux. Que mudanças posso fazer no código -fonte para adicionar suporte de arquivo grande ao criar com Darwin?

Foi útil?

Solução

Na Darwin, a E/S do arquivo é de 64 bits por padrão (pelo menos 10.5, pelo menos), acabei de encontrar isso gritando em/usr/incluir:

sys/_types.h:typedef __int64_t  __darwin_off_t;

unistd.h:typedef __darwin_off_t     off_t;

Então, tudo que você precisa fazer é algo como

#ifdef __APPLE__
#  define off64_t off_t
#  define fopen64 fopen
...
#endif

Outras dicas

Embora essa pergunta tenha uma resposta aceita com votos atualizados, que funciona, acho que a solução é um pouco enganosa. Em vez de consertar algo É sempre melhor evitar ter que consertá -lo mais tarde.

Por exemplo para o fopen64 função o Biblioteca GNU C. Os documentos dizem:

Se as fontes forem compiladas com _FILE_OFFSET_BITS == 64 Em uma máquina de 32 bits Esta função está disponível sob o nome fopen e substitui de forma transparente a interface antiga.

Você pode simplesmente usar a mesma função fopen em sistemas que suportam E/S de 64 bits por padrão e você pode definir o _FILE_OFFSET_BITS=64 Sinalizador em 32 bits sem a necessidade de redes redefine. O mesmo vale para tipos como off64_t vs. off_t.

Salve as redefinições para o caso quando precisar lidar com fontes de terceiros e usar funções padrão em seu próprio código.

Os comandos fseeko e similares funcionam com suporte de arquivo grande, para que não seja necessária para o fseeko64 etc Página do Apple Man

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top