我在使用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时使用相同的逻辑.
重新定义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)
| 归档时间: |
|
| 查看次数: |
19843 次 |
| 最近记录: |