在Windows下编译程序会产生一堆“错误:带有C链接的模板”报告

时间:2015-04-26 00:59:18

标签: c++ opengl mingw-w64 msys2

我已经使一个OpenGL项目可以与GCC(版本4.7.3和更新版本)兼容并可在Linux上运行。当尝试使用安装了GCC 4.9.2的MSYS2在Windows下编译相同的代码时,我收到大量的错误报告:

g++ -g --std=c++11 src/*.cpp -Iinclude -Isrc -lIL -lILU -lILUT -lGL -lGLU -lglut -lm -DWIN32 -I/mingw64/include windows/src/*.cpp -o "Achtung, die Kurve 3D!"
In file included from /usr/lib/gcc/x86_64-pc-msys/4.9.2/include/c++/bits/stringfwd.h:40:0,
                 from /usr/lib/gcc/x86_64-pc-msys/4.9.2/include/c++/string:39,
                 from include/windows.h:1,
                 from /usr/include/w32api/GL/gl.h:13,
                 from /mingw64/include/GL/freeglut_std.h:143,
                 from /mingw64/include/GL/freeglut.h:17,
                 from src/controls.cpp:1:
/usr/lib/gcc/x86_64-pc-msys/4.9.2/include/c++/bits/memoryfwd.h:63:3: error: template with C linkage
   template<typename>
   ^
/usr/lib/gcc/x86_64-pc-msys/4.9.2/include/c++/bits/memoryfwd.h:66:3: error: template specialization with C linkage
   template<>
   ^
/usr/lib/gcc/x86_64-pc-msys/4.9.2/include/c++/bits/memoryfwd.h:70:3: error: template with C linkage
   template<typename, typename>
   ^

...

In file included from /mingw64/include/GL/freeglut_std.h:143:0,
                 from /mingw64/include/GL/freeglut.h:17,
                 from src/controls.cpp:1:
/usr/include/w32api/GL/gl.h:684:1: error: ‘WINGDIAPI’ does not name a type
 WINGDIAPI void APIENTRY glAccum(GLenum op,GLfloat value);

...

/usr/include/w32api/GL/gl.h:1037:24: error: expected ‘)’ before ‘*’ token
 typedef void (APIENTRY *PFNGLGETCOLORTABLEPARAMETERFVEXTPROC)(GLenum target,GLenum pname,GLfloat *params);
                        ^
In file included from /mingw64/include/GL/freeglut_std.h:144:0,
                 from /mingw64/include/GL/freeglut.h:17,
                 from src/controls.cpp:1:
/usr/include/w32api/GL/glu.h:24:25: error: expected initializer before ‘gluErrorString’
 const GLubyte *APIENTRY gluErrorString(GLenum errCode);
                         ^
/usr/include/w32api/GL/glu.h:25:25: error: expected initializer before ‘gluErrorUnicodeStringEXT’
 const wchar_t *APIENTRY gluErrorUnicodeStringEXT(GLenum errCode);
                         ^

...

这是从仅包含4500行错误的部分日志中获取的。这些是最常见的重复次数。

我以前认为这个问题在旧的MSYS / MinGW(而不是MSYS2端口)中存在,我首先尝试使用相同的结果。但是,MSYS2并没有解决这些让我完全无能为力的问题,因为我的代码是用C ++编写的,它只需要标准的C和C ++头文件以及一些GL文件。我不使用任何外部的“C”镶边。

2 个答案:

答案 0 :(得分:1)

您在这里使用的是msys2 GCC,而不是mingw-w64 GCC。

请阅读MSYS2维基[1],其中解释了所有这些内容,但简要说明了一下:

运行mingw64_shell.bat,而不是msys2_shell.bat,安装mingw-w64 GCC工具链包。此命令使用bash大括号扩展功能安装32位和64位:

pacman -S mingw-w64-{x86_64,i686}-toolchain

..然后看到gcc -dumpmachine报告x86_64-w64-mingw32而非x86_64-pc-msys

[1] https://sourceforge.net/p/msys2/wiki/Home/

答案 1 :(得分:0)

该问题与OpenGL无关,也与MSYS(2)/ MinGW(-w64)或MS Visual Studio 2013无关。

对于可能遇到与我相同问题的任何人,绝大多数错误报告都是生成的,因为我的项目的include路径中存在自定义windows.h头文件。标准Windows头库中存在具有相同名称的标头,这对于其他库的正常功能至关重要。

获得的经验:永远不要尝试在操作系统之后使用系统特定的代码命名文件。