Я сделал проект OpenGL скомпилированным с GCC (версия 4.7.3 и новее) и работающим на Linux. При попытке скомпилировать тот же код под Windows, используя MSYS2 с установленным GCC 4.9.2, я получаю тонны сообщений об ошибках:
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».
Вы используете msys2 GCC здесь, а не mingw-w64 GCC.
Пожалуйста, прочтите MSYS2 wiki [1], где все это объясняется, но кратко:
Бежать mingw64_shell.bat
не msys2_shell.bat
, установите пакет (ы) набора инструментов GCC mingw-w64. Эта команда устанавливает как 32-разрядные, так и 64-разрядные, используя функцию расширения фигурной скобки bash:
pacman -S mingw-w64-{x86_64,i686}-toolchain
.. тогда посмотри gcc -dumpmachine
отчеты x86_64-w64-mingw32
и не x86_64-pc-msys
Проблема оказалась не связанной с OpenGL, ни с MSYS (2) / MinGW (-w64), ни с MS Visual Studio 2013.
Для тех, кто может столкнуться с теми же проблемами, что и я, подавляющее большинство всех отчетов об ошибках было создано из-за windows.h
заголовочный файл присутствует в пути включения моего проекта. Заголовок с тем же именем присутствует в стандартной библиотеке заголовков Windows и необходим для правильной работы других библиотек.
Извлеченный урок: никогда не пытайтесь назвать файл с системным кодом после операционной системы.