【问题标题】:Compilation errors with CImgCImg 编译错误
【发布时间】:2016-07-15 17:31:43
【问题描述】:

我是第一次使用 CImg 库,但我在一个仅包含 CImg.h 的简单测试程序中遇到了编译错误。这是为什么?我该如何解决这个问题?

程序代码:

#include "../headers/CImg.h"
using namespace cimg_library;
int main()
{
    return 0;
}

编译错误:

In function 'FILE* cimg_library::cimg::fopen(const char*, const char*)':
5065|error: '_fileno' was not declared in this scope
In function 'int cimg_library::cimg::fseek(FILE*, INT_PTR, int)':
5093|error: '_fseeki64' was not declared in this scope
In function 'INT_PTR cimg_library::cimg::ftell(FILE*)':
5102|error: '_ftelli64' was not declared in this scope

这是在装有 64 位 Windows 8.1 的 PC 上完成的。

命令:

g++.exe -Wall -fexceptions -g -std=c++11  -c "D:\informatics\Projects\image experiments\Rectangle to circle stretcher\sources\main.cpp" -o obj\Debug\sources\main.o

我在没有 -std=c++11 部分的情况下尝试了这个,但我得到了 2 个错误而不是 3 个。我没有得到 5065|error: '_fileno' was not declared in this scope。如果我将其替换为 -std=gnu++11

,也会发生同样的情况

我还在运行 64 位版本的 Windows 7 的笔记本电脑上进行了尝试,并且在那里发生了同样的情况。

到目前为止,我已经解决了第一个错误,但没有解决其他两个错误。

【问题讨论】:

  • 你是如何编译它的——你的命令是什么?你在哪个平台上?
  • @Mark Setchell 已编辑。
  • 尝试将#include <stdio.h> 添加为您的第一行。
  • 不,没用。
  • 我不使用 Windows,所以我只是猜测使用 cmets 而不是回答,但也许我们会以这种方式到达那里。尝试添加#include <cstdio> 作为您的第一行。尝试将部分或全部添加到您的编译命令 -Dcimg_display=0 的开头附近,和/或 -lgdi32 在结尾处。

标签: c++ compilation compiler-errors cimg


【解决方案1】:

如果是 CodeBlock 16.01 stdio.h 包含行

#if __MSVCRT_VERSION__ >= 0x800
_CRTIMP int __cdecl __MINGW_NOTHROW     _fseek_nolock (FILE*, long, int);
_CRTIMP long __cdecl __MINGW_NOTHROW    _ftell_nolock (FILE*);

_CRTIMP int __cdecl __MINGW_NOTHROW     _fseeki64 (FILE*, __int64, int);
_CRTIMP __int64 __cdecl __MINGW_NOTHROW _ftelli64 (FILE*);
_CRTIMP int __cdecl __MINGW_NOTHROW     _fseeki64_nolock (FILE*, __int64, int);
_CRTIMP __int64 __cdecl __MINGW_NOTHROW _ftelli64_nolock (FILE*);
#endif

即除非__MSVCRT_VERSION__ 至少为 0x800,否则不会声明这些函数。以下可能有效(至少对 CodeBlocks 16.01 有效)

#if defined(__MINGW32__)
#define __MSVCRT_VERSION__ 0x800
#define _WIN32_WINNT 0x0500
#endif

// if needed
// #define _fileno fileno

#include "CImg.h"

如果 stdio.h 不包含_fseeki64 和其他人的声明,要么

  • 使用不使用_fseeki64的CImg 1.6.9,
  • 升级 gcc/g++,或
  • _fseeki64 提供自己的实现(如果可以在某处找到这样的实现)。

【讨论】:

  • 我只想指出我不使用默认编译器 thjat 附带 Code::Blocks,而是使用 64 位版本的 MinGW,所以我应该更改其中的任何部分吗? (我也尝试了默认的,但我得到了同样的错误。)
  • @indjev99 您可能应该编辑您的问题以包含有关您的开发环境的具体细节。如果文件 stdio.h 没有声明 _fseeki64,则早期版本的 CImg (1.6.9) 可能会起作用,因为它不调用 _fseeki64
  • @indjev99 我确实用 64bit g++ v5.4.0(msys2 环境)测试了我的解决方案,并且编译成功了。
  • 非常感谢,它成功了。我了解#define __MSVCRT_VERSION__ 0x800 行的用途,但为什么我们需要下一行(#define _WIN32_WINNT 0x0500)?我试过了,没有它也可以。
  • @indjev99 我认为可以省略(或至少将其定义为 0x502 对应于 windows xp sp2 / server 2003 sp2)。该定义和WINVER 可能会影响编译时可用的库函数和定义。 Using the Windows Headers
猜你喜欢
  • 2014-03-31
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多