18

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

问题是off64_t使用. (当一切正常编译时)<sys/types.h>gccg++

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

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

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

7 回答 7

18

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 时使用相同的逻辑。

于 2014-03-26T14:44:50.537 回答
7

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

CFLAGS= -Doff64_t=__off64_t

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

于 2016-01-18T11:13:42.700 回答
5

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

于 2015-06-03T01:14:29.780 回答
2

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

#define __USE_LARGEFILE64
#include <sys/types.h>
#include <unistd.h>
于 2017-07-27T13:17:10.823 回答
1

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

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

要安装 linux 头文件,请使用

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

附言

$ 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
于 2014-03-26T14:43:05.130 回答
0

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

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

于 2018-12-27T03:48:50.583 回答
0

抱歉迟到了,但直到今天我才不得不在 C 程序中嵌入 perl 代码^^

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

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

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

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

...我从与off_toff64_t相关的一长串注释和错误中得出一个干净的构建结果^^

于 2018-03-31T10:17:47.057 回答