未知类型名称 'off64_t'

20

在Ubuntu上使用GCC 4.8.1编译Apache Portable Runtime时遇到了问题。

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

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

要重现错误,只需尝试编译以下代码即可:

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

这可能会有所帮助 https://dev59.com/Dmox5IYBdhLWcg3wpFz5 - Pavan Manjunath
由于在搜索“error: 'off64_t' does not name a type”时,此问题首先出现,因此在这种情况下帮助我的解决方案是从$ g++ --std=c++11切换到$ g++ --std=gnu++11 - Evgeni Sergeev
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定义方面使用相同的逻辑。


7

在编译标志中将off64_t重新定义为__off64_t。编辑你的Makefile文件,使其包含以下内容:

CFLAGS= -Doff64_t=__off64_t

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


1
请翻译以下与编程有关的内容,仅返回翻译文本:如果/u/xTrameshmen更新了他的答案,请随意删除此内容。 - Raynal Gobel

5
有点晚了,但仍然是当前的解决方法。 我只需在编译器标志中添加-Doff64_t=_off64_t。

1
你能否更新你的答案,更详细地解释为什么这个方法可行,并且是其他答案的良好替代方案? - Martin Serrano

2
在我的环境中,gcc版本为4.1.2,我需要定义__USE_LARGEFILE64。我在/usr/include/unistd.h中找到了定义lseek64()的宏。
#define __USE_LARGEFILE64
#include <sys/types.h>
#include <unistd.h>

1
您应该定义$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

0

0

抱歉回复晚了,但今天直到现在我才第一次需要在C程序中嵌入Perl代码^^

我解决了Unix/Linux系统中的问题(我认为自Windows Vista以来在Windows系统中也可能创建这样的功能),方法是创建一个指向Perl版本CORE文件夹的符号链接...

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

在您的项目文件、源代码中,只需添加以下内容:
#include <perl/EXTERN.h>
#include <perl/perl.h>

...然后我从与off_toff64_t相关的一长串笔记和错误中走出来,获得了一个干净的构建结果^^


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接