我在使用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;
答案 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位: