0 / 0 / 0
Регистрация: 29.10.2018
Сообщений: 4
1

Совместимость OpenGL C++ с MinGW GCC (проблема с библиотеками)

06.04.2021, 15:15. Показов 538. Ответов 1

Краткое описание проблемы: Система Win10 x64, поставил с нуля компилятор C++: MinGW 8.0.0 с GCC 6.3.0, подключил библиотеки FreeGLUT 3.0.0 и Glew 2.1.0. Функции, флаги, инклюды библиотек не хотят работать с классическими библиотеками, к примеру, <iostream>.

Подробное описание сборки компилятора.

Моя система: Windows 10 Домашняя x64.
Поставил MinGW версии 8.00, включающую в себя компилятор GCC C++ Compiler версии 6.3.0, в папку C:/MinGW.
Скачал библиотеки:
1. Бинарник FreeGLUT для MinGW версии 3.0.0-1 (freeglut.dll для x64 забросил в C:/Windows/SysWOW64, файлы из /include/ и /lib/ поместил в соответственно C:/MinGW/include и C:/MinGW/lib).
2. Исходник Glew версии 2.1.0. Скомпилировал соответствующими командами:
Код
gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c
gcc -nostdlib -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a    -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32
ar cr lib/libglew32.a src/glew.o
Получил 3 файла в /bin/: glew32.dll, glew32.dll.a и glew32.a.
DLL забросил в C:/Windows/SysWOW64, файлы .A забросил в C:/MinGW/lib, файлы из /include/ и /lib/ поместил в соответственно C:/MinGW/include и C:/MinGW/lib.
В переменных среды и для одного, и для всех пользователей в PATH поставил пути C:/MinGW/bin, C:/MinGW/msys/1.0/bin, C:/MinGW/include.

Следующие проблемы:
Создал hello.cpp такого типа.
C++
1
2
3
4
5
#include <iostream>
int main(int argc, char *argv[]) {
    std::cout << "Hello World\n";
    return 0;
}
Компилирую с линкерами FreeGLUT, Glew32, флагом определения системы, и флагом ansi, который мне предложил <_mingw.h>: (Без него выходит просто умопомрачительное количество ошибок)
Код
C:\Users\avkol\cg>g++ -o hello.exe hello.cpp -lfreeglut -lglew32 -Wl,--subsystem,windows -ansi
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\postypes.h:40:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\iosfwd:40,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\ios:38,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\ostream:38,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\iostream:39,
                 from hello.cpp:1:
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cwchar:164:11: ошибка: <::vfwscanf> не был декларирован
   using ::vfwscanf;
           ^~~~~~~~
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cwchar:170:11: ошибка: <::vswscanf> не был декларирован
   using ::vswscanf;
           ^~~~~~~~
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cwchar:174:11: ошибка: <::vwscanf> не был декларирован
   using ::vwscanf;
           ^~~~~~~
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cwchar:191:11: ошибка: <::wcstof> не был декларирован
   using ::wcstof;
           ^~~~~~
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\locale_facets.h:39:0,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\bits\basic_ios.h:37,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\ios:44,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\ostream:38,
                 from c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\iostream:39,
                 from hello.cpp:1:
c:\mingw\lib\gcc\mingw32\6.3.0\include\c++\cwctype:89:11: ошибка: <::iswblank> не был декларирован
   using ::iswblank;
           ^~~~~~~~

C:\Users\avkol\cg>
Ошибка не меняется, если я добавляю в начало инклюды, а в main функцию. За этот код, кстати, не обязательно хвататься: это тестовый код для начала работы на OpenGL. Мне нужна была лишь реакция компилятора.
(Я не пишу вместо <C:/MinGW/include/GL/glew.h> <GL/glew.h>, потому что переменные среды по странной причине не работают для MinGW, переустановка не помогла.)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <_mingw.h>
#include <C:/MinGW/include/GL/glew.h>
#include <C:/MinGW/include/GL/freeglut.h>
#include <C:/MinGW/include/GL/gl.h>
 
using namespace std;
 
int main(int argc, char** argv) {
 
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutInitContextVersion(2, 1);
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);
 
    if (glewInit()) {
    cerr << "Unable to initialize GLEW ... exiting\n";
    exit(EXIT_FAILURE);
    }
 
    glutMainLoop();
}
При добавлении линкеров на папки /include/ и /lib/ в MinGW (-I"C:\MinGW\include" -L"C:\MinGW\lib"), ошибка, опять же, не изменяется.

Если вы хоть чем-то можете помочь, предлагайте свои идеи, решения. Не стесняйтесь спрашивать у меня абсолютно всё, что нужно, чтобы решить этот вопрос. Почему компилятор ругается на #include <iostream>, когда я ставлю линкеры на DLL библиотек в SysWOW64, почему при этом ссылается на cwchar в MinGW? Как это исправить? Что нужно сделать?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.04.2021, 15:15
Ответы с готовыми решениями:

Mingw-w64 MinGW TDM-GCC
Всем привет. Хочу понять, существует ли принципиальная разница между Mingw-w64, MinGW и...

Gcc без MinGW
Интересует вопрос, можно ли рабочий код (который без ошибок компилируется в Visual Studio)...

Как обновить gcc в MinGW?
Недавно возникла необходимость скомпилить один проект, используя MinGW (я на win10). Возникла...

Linker Ошибки [gcc\MingW]
Есть код : #define _WIN32_WINNT 0x0500 //Необходимо для определения функции GetConsoleWindow() в...

1
0 / 0 / 0
Регистрация: 29.10.2018
Сообщений: 4
07.04.2021, 16:45  [ТС] 2
Переустановил всё вышеуказанное, также все Microsoft Windows Visual C++ Redistributable.
Поставил freeglut.dll для версии x32 в папку System32, freeglut.dll для версии x64 в папку SysWOW64, glew32.dll для версии x32 в папку System32.

Ошибка исчезает, если включать в код инклюды внешних библиотек. Если просто запускать Hello World без кода OpenGL и кидать в компиляцию кучу флагов OpenGL, хорошим это не кончается.

Так вот. Эта проблема разбилась на 2.

1 проблема. Теперь другая ошибка. Далее приведён код файла hello.cpp, компиляция и фотография ошибки.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <C:/MinGW/include/GL/glew.h>
#include <C:/MinGW/include/GL/gl.h>
#include <C:/MinGW/include/GL/freeglut.h>
 
#define GLEW_STATIC
 
using namespace std;
 
int main(int argc, char *argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutInitContextVersion(4, 1); // Версия OpenGL, которую вы хотите использовать
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);
    glutMainLoop();
    return 0;
}
Код
g++ -o hi.exe hello.cpp -lmingw32 -lopengl32 -lfreeglut -lglu32 -lglew32 -Wl,--subsystem,windows
При запуске файл hi.exe выдаёт ошибку 0xc0000007b без контекста.

На данный момент проблема совместимости решена, но возникла другая проблема.
Прошу решить также текущую проблему ошибки 0xc0000007b.

2 проблема. При добавлении glewInit в программу, GCC не может её определить. Далее приведён код программы, компиляция и сообщение об ошибке. Это странно, ведь инклюд glew.h и линк -lglew32 присутствуют.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <C:/MinGW/include/GL/glew.h>
#include <C:/MinGW/include/GL/gl.h>
#include <C:/MinGW/include/GL/freeglut.h>
 
#define GLEW_STATIC
 
using namespace std;
 
int main(int argc, char *argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutInitContextVersion(4, 1); // Версия OpenGL, которую вы хотите использовать
    glutInitContextProfile(GLUT_CORE_PROFILE);
    glutCreateWindow(argv[0]);
    if (glewInit()) {
    std::cerr << "Unable to initialize GLEW ... exiting\n";
    exit(EXIT_FAILURE);
    }
    glutMainLoop();
    return 1;
}
Код
C:\Users\avkol\cg>g++ -o hi.exe hello.cpp -lmingw32 -lopengl32 -lfreeglut -lglu32 -lglew32 -Wl,--subsystem,windows
C:\Users\avkol\AppData\Local\Temp\cciwoBrO.o:hello.cpp:(.text+0xfe): undefined reference to `_imp__glewInit@0'
collect2.exe: ошибка: выполнение ld завершилось с кодом возврата 1
Возможно, эти две проблемы как-то связаны. Предлагайте свои идеи, решения. Не стесняйтесь спрашивать у меня абсолютно всё, что нужно, чтобы решить этот вопрос.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2021, 16:45

Какой GCC+MinGW нужно устанавливать?
У меня Убунта 14.04 64 разрядная, в списке дистрибутив компиляторов много, какой из них выбрать и...

Почему не работает gfortran -c в MinGW GCC 8.1.0 ?
Здравствуйте. Я этот ЯП учу всего лишь для учёбы, но меня всё же зацепила эта проблема. Мы...

minGW/GCC: как собрать из исходников?
Приветствую! Суть идеи: компиляция кода С++ в память, и выполнение его оттуда. Т.е. как DLL,...

Упаковка ресурсов в exe. gcc (MinGW)
Здравствуйте. Возникла задача упаковать различного рода файлы в программу. Пробовал создавать...

Сборки MinGW(GCC-win32/win64) от niXman
с этого момента, буду производить тестовые/пререлизные/релизные сборки mingw. файлы с пометкой...

Ошибки при компиляции ClanLib с помощью GCC(MinGW) 4.6.2
компилирую ClanLib с помощью GCC(MinGW) 4.6.2 делаю configure --enable-clanDisplay...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.