Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
1

Сборка программы на openGL, glfw, glew

21.06.2019, 23:00. Показов 2645. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот уж не думал, что возникнут проблемы с этим... Но я не могу скомпилировать банальную программу c 3-мя инклудами, одним glfwInit и 4-мя glfwWindowHint на mingw-w64 g++, получаю ошибки линковки:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\Users\dan25_000\Documents\Projects\Learn\opengl-engine [master ≡ +8 ~0 -0 !]> make
g++ -I ext/inc -c src/main.cpp -o bin/obj/main.o
g++  -L"ext/libs" -l"glew32" -l"glfw3" bin/obj/main.o -o bin/main.exe
bin/obj/main.o:main.cpp:(.text+0x15): undefined reference to `glfwInit'
bin/obj/main.o:main.cpp:(.text+0x24): undefined reference to `glfwWindowHint'
bin/obj/main.o:main.cpp:(.text+0x33): undefined reference to `glfwWindowHint'
bin/obj/main.o:main.cpp:(.text+0x42): undefined reference to `glfwWindowHint'
bin/obj/main.o:main.cpp:(.text+0x51): undefined reference to `glfwWindowHint'
bin/obj/main.o:main.cpp:(.text+0x76): undefined reference to `glfwCreateWindow'
bin/obj/main.o:main.cpp:(.text+0xa8): undefined reference to `glfwTerminate'
bin/obj/main.o:main.cpp:(.text+0xbb): undefined reference to `glfwMakeContextCurrent'
bin/obj/main.o:main.cpp:(.text+0xc2): undefined reference to `__imp_glewExperimental'
collect2.exe: error: ld returned 1 exit status
make: *** [bin/main.exe] Ошибка 1
Сама программа - на 99% копипаст learnopengl:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main(int argc, char const *argv[]) {
    glfwInit();
 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
 
    GLFWwindow* window = glfwCreateWindow(800, 600, "Some window", nullptr, nullptr);
    if(window == nullptr) {
        std::cout << "Окно где?" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);
 
    glewExperimental = GL_TRUE;
    if(glewInit != GLEW_OK) {
        std::cout << "This is not OK!" << std::endl;
        return -1;
    }
 
    int w, h;
    glfwGetFramebufferSize(window, &w, &h);
    glViewport(0, 0, w, h);
 
    while(!glfwWindowShouldClose(window)) {
        glfwPollEvents();
        glfwSwapBuffers(window);
    }
 
    glfwTerminate();
    return 0;
}
(если что, та же проблема была и когда после 4-го glfwWindowHint шёл сразу return 0)
libglew32.a, libglew32.dll.a, libglfw3.a скомпилированы мной лично, но со скачанными пре-компилированными всё то-же самое (правда, я не смог найти прекомпилированную libglew32.a, пришлось линковать с glew32.dll, но проблема всё равно не в нём, а ошибки те-же):
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
g++ -I ext/inc -c src/main.cpp -o bin/obj/main.o
g++ ext/dlls/glew32.dll -L"ext/precompiled libs" -l"glfw3" bin/obj/main.o -o bin/main.exe
bin/obj/main.o:main.cpp:(.text+0x15): undefined reference to `glfwInit'
bin/obj/main.o:main.cpp:(.text+0x24): undefined reference to `glfwWindowHint'
bin/obj/main.o:main.cpp:(.text+0x33): undefined reference to `glfwWindowHint'
bin/obj/main.o:main.cpp:(.text+0x42): undefined reference to `glfwWindowHint'
bin/obj/main.o:main.cpp:(.text+0x51): undefined reference to `glfwWindowHint'
bin/obj/main.o:main.cpp:(.text+0x76): undefined reference to `glfwCreateWindow'
bin/obj/main.o:main.cpp:(.text+0xa8): undefined reference to `glfwTerminate'
bin/obj/main.o:main.cpp:(.text+0xbb): undefined reference to `glfwMakeContextCurrent'
collect2.exe: error: ld returned 1 exit status
make: *** [bin/main.exe] Ошибка 1
И, что самое странное, если линковать не с libglfw3.a, а с glfw3.dll - всё успешно собирается! И даже запускается, правда glew не инициализируется:
PowerShell
1
2
3
4
5
6
C:\Users\dan25_000\Documents\Projects\Learn\opengl-engine [master ≡ +8 ~0 -0 !]> make
g++ -I ext/inc -c src/main.cpp -o bin/obj/main.o
g++ ext/dlls/glew32.dll ext/dlls/glfw3.dll -L"ext/libs"  bin/obj/main.o -o bin/main.exe
cp ext/dlls/glew32.dll bin; cp ext/dlls/glfw3.dll bin;
C:\Users\dan25_000\Documents\Projects\Learn\opengl-engine [master ≡ +8 ~0 -0 !]> .\bin\main.exe
This is not OK!
Это меня, конечно, волнует, но для начала хотелось бы разобраться - что не так с .a библиотеками? Я собирал их 64-битным g++ (надеюсь, фиг его знает, что мне там cmake намутил), свою программу компилировал им же, и, когда не удалось с моими, я использовал скачанные прекомпилированные 64-битные библиотеки, и, почему-то, когда я решил использовать dll - всё заработало...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2019, 23:00
Ответы с готовыми решениями:

Из огня да в полымя. GLFW, GLEW, Линковка
Эта тема не является вопросом, а пояснение что, где, когда, почему и как, нужно инициализировать...

Правильная сборка GLFW под VS2015
Здравствуйте, при использовании своей игры на других пк на которых нету visual studio, требуются...

GLFW + Npp -> NppExec. Не могу Слинковать GLFW
Здравствуйте! У меня не получается слинковать GLFW. Оно вроде как компилируется, так как ошибки...

LNK1120: 2 unresolved externals | Glew | GLFW
Выходит ошибки при компелирование кода, надеюсь кто-нибудь подскажет, в чем может быть проблема....

12
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
21.06.2019, 23:49 2
Цитата Сообщение от Max_Cross Посмотреть сообщение
когда я решил использовать dll - всё заработало...
так если заработало что еще нужно? И эта ошибка: undefined reference to j обычно когда file.h подключена, а .dll, .lib, .a файлы не добавлены в проект
0
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
22.06.2019, 18:28  [ТС] 3
Если что, проблема по-прежнему не решена. Я всё ещё хочу знать, почему при линковке как с libglfw3.a, так и с libglew32.a он не находит нужные методы в них, а при линковке с dll не инициализируется glew.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
22.06.2019, 23:01 4
Статическая библиотека (также известная как архив) состоит из подпрограмм, которые скомпилированы и связаны непосредственно с вашей программой. Когда вы компилируете программу, которая использует статическую библиотеку, все функции статической библиотеки, которые использует ваша программа, становятся частью вашего исполняемого файла. В Windows статические библиотеки обычно имеют расширение .lib, тогда как в linux статические библиотеки обычно имеют расширение .a (архив). Одним из преимуществ статических библиотек является то, что вам нужно только распространять исполняемый файл, чтобы пользователи могли запустить вашу программу. Поскольку библиотека становится частью вашей программы, это гарантирует, что правильная версия библиотеки всегда используется с вашей программой. Кроме того, поскольку статические библиотеки становятся частью вашей программы, вы можете использовать их так же, как функциональность, написанную для вашей собственной программы. С другой стороны, поскольку копия библиотеки становится частью каждого исполняемого файла, который ее использует, это может привести к значительному расходу пространства. Статические библиотеки также не могут быть легко обновлены - чтобы обновить библиотеку, необходимо заменить весь исполняемый файл.


Динамическая библиотека (также называемая разделяемая библиотека ) состоит из подпрограмм, которые загружаются в приложение во время выполнения. Когда вы компилируете программу, которая использует динамическую библиотеку, библиотека не становится частью вашего исполняемого файла - она ​​остается отдельным модулем. В Windows динамические библиотеки обычно имеют расширение .dll (библиотека динамических ссылок), тогда как в Linux динамические библиотеки обычно имеют расширение .so (общий объект). Одним из преимуществ динамических библиотек является то, что многие программы могут совместно использовать одну копию, что экономит место. Возможно, большее преимущество заключается в том, что динамическая библиотека может быть обновлена ​​до более новой версии без замены всех исполняемых файлов, которые ее используют.

Библиотека импорта это библиотека , которая позволяет автоматизировать процесс загрузки и использования динамической библиотеки. В Windows это обычно делается через небольшую статическую библиотеку (.lib) с тем же именем, что и динамическая библиотека (.dll). Статическая библиотека связана с программой во время компиляции, и тогда функциональность динамической библиотеки может эффективно использоваться, как если бы она была статической библиотекой. В Linux файл общего объекта (.so) дублируется как динамическая библиотека, так и библиотека импорта. Большинство компоновщиков могут создавать библиотеку импорта для динамической библиотеки при ее создании.
1
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
22.06.2019, 23:16  [ТС] 5
Мне это по прежнему ничего не даёт. Различие между статической и динамической библиотекой я знаю. Понятия не имею, собрал ли мне cmake статическую библиотеку или библиотеку импорта (но, скорее всего - первое, так как никакого dll вместе с ним он не собрал), но в любом случае ошибок при сборке то быть не должно! Если бы была проблема с тем, например, что я залинковался с библиотекой импорта, а рядом с exe-шником нет dll-ки, то проблема появилась бы при запуске, но, как я писал - проблема при линковке!
И, не знаю, поняли вы или нет, но я пытаюсь не просто заставить программу компилироваться и работать (ведь скомпилировать я её уже могу, слинковав с dll), а понять, почему не получается нормально слинковать с .a - библиотекой, и как я должен был компилировать исходники glew, glfw и своей собственной программы, что-бы всё в итоге заработало.
Чем мне должы били помочь эти непонятно зачем приведённый определения?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
23.06.2019, 00:17 6
скачай собраные .lib, .dll, .a
https://www.glfw.org/download.html

для mingw .dll и .a, а для Visual Studio .dll, .lib подключаешь и радуешься,

Добавлено через 1 минуту
https://github.com/glfw/glfw/r... .WIN64.zip
https://github.com/glfw/glfw/r... .WIN32.zip
0
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
23.06.2019, 00:27  [ТС] 7
Цитата Сообщение от Antikl Посмотреть сообщение
скачай собраные .lib, .dll, .a
Цитата Сообщение от Max_Cross Посмотреть сообщение
но со скачанными пре-компилированными всё то-же самое
...
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
23.06.2019, 00:30 8
Цитата Сообщение от Max_Cross Посмотреть сообщение
Понятия не имею, собрал ли мне cmake статическую библиотеку или библиотеку импорта (но, скорее всего - первое, так как никакого dll вместе с ним он не собрал)
cmake собирает проект на основе которые ты указал в cmake потом этот проект нужно скомпилировать в своей IDE ну в Visual Studio или codeblocks хз что у тебя там вот и все, после компиляции будут dll lib и a, я только что все проделал все работает
0
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
23.06.2019, 00:38  [ТС] 9
Я собирал банальным cmake -G"MinGW Makefiles" и make. И я использую VS Code, так что, можно сказать, я не использую IDE вообще. Я вообще не люблю IDE, которые делают всё сами и совсем непонятно как...
И учитывая, что с прекомпилированными библиотеками результат тот же - собрал я всё правильно.
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
23.06.2019, 00:42 10
вот старые версии пробуй их
https://sourceforge.net/projec... /glfw/3.0/
https://sourceforge.net/projec... lfw/2.7.9/
0
8Observer8
23.06.2019, 10:35
  #11

Не по теме:

--deleted--

0
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
23.06.2019, 23:52  [ТС] 12
И нужно было всего-то, барабанная дробь... Поставить входной main.o файл перед остальными опциями линкера... Блин, все компиляторы такие неочевидные?
0
12 / 3 / 0
Регистрация: 12.07.2015
Сообщений: 69
24.06.2019, 13:29  [ТС] 13
Кстати, а в чём разница между libglew32.a и libglew32.dll.a? Просто и с тем и с тем программа собирается нормально, но при этом в обоих случаях отказывается работать, если в папке с exe-файлом нет glew32.dll, даже если поставить #define GLEW_STATIC. Я, конечно, не против, но всё-же...

Добавлено через 4 часа 3 минуты
Цитата Сообщение от Max_Cross Посмотреть сообщение
Кстати, а в чём разница между libglew32.a и libglew32.dll.a? Просто и с тем и с тем программа собирается нормально, но при этом в обоих случаях отказывается работать, если в папке с exe-файлом нет glew32.dll, даже если поставить #define GLEW_STATIC. Я, конечно, не против, но всё-же...
Вообще, дело было в том, что в папке с библиотеками был libglew32.dll.a, и g++ почему-то линковал с ним, хотя я указывал -lglew32. А если libglew32.dll.a оттуда убрать, то я получаю кучу undefined reference на __imp_wglGetProcAddress.
Ну да ладно, линковка с libglew32.dll.a работает, этого мне пока хватит.
0
24.06.2019, 13:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.06.2019, 13:29
Помогаю со студенческими работами здесь

Как подключить библиотеки GLEW GLFW в проекте на С#
Как подключить библиотеки GLEW GLFW в проекте на С#

VC++ 2015, GLEW, GLFW, ссылка на неразрешённый внешний символ
Ошибка LNK2019 ссылка на неразрешенный внешний символ _gluOrtho2D@32 в функции _main #include...

Сборка glfw: как работает cmake?
Задача: собрать glfw при помощи g++, cmake и make. Всё прекрасно работает, если собирать при...

Не видит функций OpenGL, хотя GLFW подключен
Приветствую. Решил начать изучать OpenGL, возникла следующая проблема: линковщик ругается на...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru