替代Cysewin的fseeko?

时间:2013-12-13 18:06:58

标签: c gcc cygwin posix fseek

我安装了Cygwin(CYGWIN_NT-6.1 AlexReynolds-PC 1.7.27(0.271/5/3) 2013-12-09 11:54 x86_64 Cygwin)和GNU gcc / g ++ 4.8.1。

我正在编译一些使用POSIX C I / O例程的工具,例如fseeko()并获得以下类型的致命错误:

 error: ‘fseeko’ was not declared in this scope
     int retValue = fseeko(stream, offset, whence);

在Cygwin上的GNU gcc / g ++ 4.8.1中是否有fseeko()?是否可以使用可靠地支持64位偏移的替代方案?

3 个答案:

答案 0 :(得分:2)

我在使用GCC 4.7.3安装Cygwin(fseeko())时可以使用

CYGWIN_NT-6.1-WOW64 1.7.25(0.270/5/3) 2013-08-31 20:39 i686 Cygwin。但是如果您的安装由于某种原因没有它,那么您有几个选择:

  • fseek(),但需要注意的是偏移可能限制在32位而不是64位(取决于sizeof(long)
  • fsetpos(),其中fpos_t为偏移量。但是,fpos_t可能是一个不透明的结构,因此使用它的唯一可靠方法是调用fgetpos()获取当前位置,然后调用fsetpos()以将偏移恢复到较早的位置位置;否则你不能用它来寻找特定的偏移量。

答案 1 :(得分:0)

只需使用fseek。只要你的long是64位,就没有区别。

答案 2 :(得分:0)

在我的情况下,错误是因为我使用--std=c++11编译了程序。将其更改为--std=gnu++11修复了编译问题,但现在我想知道我是否应该使用fseeko

然后我偷看了Cygwin的/usr/include/stdio.h并发现了与in this discussion相同的东西。有一个有趣的回答:

  

10月29日14:32,王宏亮写道:

     
    

大家好,

         

我的平台是WindowsXP + SP2,Cygwin DLL发布版本是1.5.24-2

         

我试图让我的程序支持大文件,所以在stdio.h中我找到了

356 #ifdef __LARGE64_FILES
357 #if !defined(__CYGWIN__) || defined(_COMPILING_NEWLIB)
         

但是,当我尝试使用_COMPILING_NEWLIB进行编译时,它失败了

  
     

永远不要那样做。它只应在编译newlib本身时设置。

     
$ gcc -Wall -D_COMPILING_NEWLIB test.c -o test
/cygdrive/c/DOCUME~1/wan/LOCALS~1/Temp/ccUmErSH.o:test.c:(.text+0x3a):
undefined reference to `_fopen64'
collect2: ld returned 1 exit status
         

似乎fopen64映射到_fopen64,而后者则缺失。

         

有人能告诉我如何使用_COMPILING_NEWLIB标志进行编译或者Cygwin如何支持大文件?

  
     

不要使用_COMPILING_NEWLIB进行编译。 64位文件访问是   Cygwin的自然文件访问类型。 off_t是8个字节。没有   foo64因此而起作用。只需使用fopen和朋友和你   免费获得64位文件。

     

科琳娜

     

- Corinna Vinschen请将有关Cygwin的邮件发送给Cygwin Project Co-Leader cygwin AT cygwin DOT com   红帽

所以你有它。