未知类型名称'off64_t'

Der*_*pit 14 gcc g++ gcc4.8

我在使用GCC 4.8.1的Ubuntu上使用Apache Portable Runtime时遇到问题

问题是编译时off64_tfrom <sys/types.h>不可用gcc.(编译时g++一切正常)

有人知道要使用哪个编译器开关来启用off64_t吗?(我知道定义_LARGEFILE_SOURCE _LARGEFILE64_SOURCE避免了问题,但想知道这是否正确)

要重现错误,可以简单地尝试编译以下代码:

#include <sys/types.h>
off64_t a_variable;
Run Code Online (Sandbox Code Playgroud)

Jam*_*ese 15

off64_t不是语言定义的类型.没有编译器开关可以使它可用.

它在sys/types.h中定义,但是(在32位系统上)仅在

  • 定义_LARGEFILE64_SOURCE
    将使64位接口可用(off64_t,lseek64()等...).
    32位接口仍将以其原始名称提供.

  • _FILE_OFFSET_BITS被定义为'64'
    这将使(其他32位)函数和数据类型的名称引用它们的64位对应物.
    off_t将是off64_t,lseek()将使用lseek64(),依此类推......
    32位接口不再可用.

确保如果在程序中的任何位置定义这些宏,则在所有源文件的开头定义它们.你不希望ODR违规在你的屁股上咬你.

注意,这适用于32位系统,其中off_t通常为32位值.
在64位系统上,接口已经是64位宽,您不需要使用这些宏来获得大文件支持.
off_t是64位类型,lseek()需要64位偏移,依此类推.
此外,没有定义名称中包含64的类型和函数,没有意义.

请参阅http://linux.die.net/man/7/feature_test_macros
http://en.wikipedia.org/wiki/Large_file_support

您可能也有兴趣知道在使用g ++时,会自动定义_GNU_SOURCE,(使用gnu c运行时库)会导致_LARGEFILE64_SOURCE被定义.这就是为什么用g ++编译测试程序会使off64_t可见.我假设APR在定义_LARGEFILE64_SOURCE时使用相同的逻辑.


小智 6

有点晚了,但仍然是最新的.我只需将-Doff64_t = _off64_t添加到编译器标志中.


Ray*_*bel 6

重新定义off64_t__off64_t您的编译标志.编辑你的Makefile所以它包含:

CFLAGS= -Doff64_t=__off64_t
Run Code Online (Sandbox Code Playgroud)

然后,运行$ make 1(假设你1.c在你的目录中)


小智 1

您应该定义 $C_INCLUDE_PATH 来指向 linux 标头,例如

export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu
Run Code Online (Sandbox Code Playgroud)

要安装 linux 头文件,请使用

sudo apt-get install linux-headers-`uname -r`
Run Code Online (Sandbox Code Playgroud)

聚苯乙烯

$ cat 1.c
#include <sys/types.h>
off64_t a_variable;
int main(){return 0;}

$ gcc --version
gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1

$ echo $C_INCLUDE_PATH
/usr/include/x86_64-linux-gnu

$ grep off64_t /usr/include/x86_64-linux-gnu/sys/types.h 
typedef __off64_t off_t;
#if defined __USE_LARGEFILE64 && !defined __off64_t_defined
typedef __off64_t off64_t;
# define __off64_t_defined
Run Code Online (Sandbox Code Playgroud)