Unknown type name ‘off64_t’

后端 未结 7 2002
你的背包
你的背包 2021-02-12 17:52

I have a problem using Apache Portable Runtime on Ubuntu with GCC 4.8.1

The problem is that the off64_t from is not availab

7条回答
  •  情书的邮戳
    2021-02-12 18:35

    off64_t is not a language defined type. No compiler switch will make it available.

    It is defined in sys/types.h, but (on a 32 bit system) only if

    • _LARGEFILE64_SOURCE is defined
      Which will make the 64 bit interfaces available (off64_t, lseek64(), etc...).
      The 32 bit interfaces will still be available by their original names.

    • _FILE_OFFSET_BITS is defined as '64'
      Which will make the names of the (otherwise 32 bit) functions and data types refer to their 64 bit counterparts.
      off_t will be off64_t, lseek() will use lseek64(), and so on...
      The 32 bit interface is no longer available.

    Make sure that if you define these macros anywhere in your program, you define them at the beginning of all your source files. You don't want ODR violations to be biting you in the ass.

    Note, this is for a 32 bit system, where off_t is normally a 32 bit value.
    On a 64 bit system, the interface is already 64 bits wide, you don't need to use these macros to get the large file support.
    off_t is a 64 bit type, lseek() expects a 64 bit offset, and so on.
    Additionally, the types and functions with 64 in their name aren't defined, there's no point.

    See http://linux.die.net/man/7/feature_test_macros
    and http://en.wikipedia.org/wiki/Large_file_support

    You also may be interested to know that when using g++, _GNU_SOURCE is automatically defined, which (with the gnu c runtime library) leads to _LARGEFILE64_SOURCE being defiend. That is why compiling your test program with g++ makes off64_t visible. I assume APR uses the same logic in making _LARGEFILE64_SOURCE defined.

提交回复
热议问题