2016-11-23 16 views
0

C에서 4GiB보다 큰 파일을 사용하기 위해 fseeko 함수를 GCC 컴파일러와 함께 사용하려고합니다. 이제 모든 것이 작동하고 파일을 사용할 수 있습니다. 4GiB 이상이지만 GCC는 fseeko 함수가 암시 적으로 선언되었다고 불평합니다. 난 아무데도 내가이 경고를 해결하기 위해 포함해야 어떤 헤더를 찾을 수 없습니다함수의 암시 적 선언

#define __USE_LARGEFILE64 
#define _LARGEFILE_SOURCE 
#define _LARGEFILE64_SOURCE 

#include "MemoryAllocator.h" 

#include <stdio.h> 
#include <stdbool.h> 
#include <stdlib.h> 
#include <sys/stat.h> 

typedef struct BlockReader { 
    char* fileName; 
    // Total filesize of the file with name fileName in bytes. 
    unsigned long long fileSize; 
    // Size of one block in bytes. 
    unsigned int blockSize; 
    // Defines which block was last read. 
    unsigned int block; 
    // Defines the total amount of blocks 
    unsigned int blocks; 
} BlockReader; 

unsigned char* blockreader_read_raw_block(BlockReader* reader, long startPos, unsigned int length, size_t* readLength) { 
    FILE* file = fopen(reader->fileName, "rb"); 

    unsigned char* buffer = (unsigned char*) mem_alloc(sizeof(unsigned char) * (length + 1)); 

    FSEEK(file, startPos, 0); 
    fclose(file); 

    // Terminate buffer 
    buffer[length] = '\0'; 
    return buffer; 
} 

이이 메시지를 생성하는 소스 코드의 최소한의 작업 예입니다. GCC가 제공 정확한 경고가 이것이다 :

src/BlockReader.c: In function ‘blockreader_read_block’: 
src/BlockReader.c:80:2: warning: implicit declaration of function ‘fseeko’ [-Wimplicit-function-declaration] 
    FSEEK(file, reader->blockSize * reader->block, 0); 
+1

'fseeko'는 표준 C가 아닌 Posix에 있습니다 – deamentiaemundi

+1

'MemoryAllocator.h'는 mem_alloc (x)을 malloc (x)로 정의하고 FSEEK를 fseeko로 가정하면이 프로그램은 POSIX 플랫폼에서 정상적으로 컴파일됩니다. 그러나 Windows에서 빌드하려고하면 작동하지 않습니다. – NickStoughton

+1

사용중인 컴파일러 명령 줄은 정확히 무엇입니까? 헤더를 넣기 전에'_XOPEN_SOURCE' 또는'_POSIX_C_SOURCE'를 적절한 값으로 설정 했습니까? –

답변

1

당신이 -std=c99 또는 -std=c11 같은 -std 옵션 중 하나를 사용하는 경우, 이러한 POSIX 인터페이스는 기본적으로 노출되지 않습니다 완전히 순응 표준 C 환경을 요청 (을 노출 응용 프로그램 용으로 예약 된 네임 스페이스에 있기 때문에 적합하지 않을 수 있습니다). 그들을 얻으려면 _POSIX_C_SOURCE 또는 _XOPEN_SOURCE을 적절한 값으로 정의해야합니다. 명령 행에서 -D_POSIX_C_SOURCE=200808L, 또는 헤더를 포함하기 전에 소스 파일에서

#define _POSIX_C_SOURCE 200808L 

는이 작업을 수행 할 수있는 방법이 될 것입니다.

또한이 문제가 직접적인 것은 아니지만 __USE_LARGEFILE64, _LARGEFILE_SOURCE_LARGEFILE64_SOURCE은 모두 잘못되었습니다. 64 비트 off_t을 얻으려면 명령 줄에서 -D_FILE_OFFSET_BITS=64을 입력하고 소스 파일에서는 #define _FILE_OFFSET_BITS 64을 입력해야 헤더를 포함 할 수 있습니다.

관련 문제