未知类型名称'off64_t'

时间:2014-03-26 14:22:04

标签: gcc g++ gcc4.8

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

问题是,使用off64_t进行编译时,<sys/types.h>中的gcc不可用。 (使用g++进行编译时,一切正常)

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

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

#include <sys/types.h>
off64_t a_variable;

7 个答案:

答案 0 :(得分:14)

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

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

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

  • _FILE_OFFSET_BITS定义为&#39; 64&#39;
    这将使(其他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时使用了相同的逻辑。

答案 1 :(得分:6)

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

答案 2 :(得分:6)

在编译标志中将off64_t重新定义为__off64_t。修改您的Makefile,使其包含:

CFLAGS= -Doff64_t=__off64_t

然后,只需运行$ make 1(假设您的目录中有1.c

答案 3 :(得分:1)

在我的环境gcc 4.1.2版中,我需要定义__USE_LARGEFILE64。我在/usr/include/unistd.h中找到了这个定义lseek64()

的宏
#define __USE_LARGEFILE64
#include <sys/types.h>
#include <unistd.h>

答案 4 :(得分:0)

你应该定义$ C_INCLUDE_PATH来指向linux头文件,比如

export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu

要安装linux标头,请使用

sudo apt-get install linux-headers-`uname -r`

P.S。

$ 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

答案 5 :(得分:0)

对于迟到感到抱歉但是我从来没有在C程序中嵌入perl代码,直到今天^^

我通过创建指向perl版本的CORE文件夹的符号链接来解决Unix / Linux系统中的问题(我认为可以在Vista中创建这样的功能,因为Vista)...

ln -s $(perl -MConfig -e 'print $Config{archlib}')/CORE /usr/include/perl

在您的项目文件源代码中,只需添加:

#include <perl/EXTERN.h>
#include <perl/perl.h>

...我来自与 off_t off64_t 相关的长备注和错误列表到干净的构建结果^^

答案 6 :(得分:0)

聚会也很晚,但是收到此问题的主要原因是安装64位版本的MinGW而不是32位:

https://sourceforge.net/projects/mingw/