Member 13013288 Ответов: 3

Проблема компоновщика с mingw, notepad++ и freeglut


Я студент, работающий с OpenGL на C++. Я пытаюсь заставить freeGLUT работать с MinGW. Я спрашиваю, потому что уже перепробовал кучу сайтов, много раз, и нет никакого четкого решения, по крайней мере, насколько мне известно. У меня эта проблема уже несколько месяцев.

Хотя использование Visual Studio было бы самой простой средой для использования, я бы предпочел использовать свою собственную настроенную среду.

Проблема, с которой я столкнулся, - это линкер. Мне, как новому пользователю, очень трудно понять, как использовать компоновщик.

Моя главная цель-просто скомпилировать любую базовую программу, например, эту тестовую:
#include <GL/glut.h>

    void displayMe(void)
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_POLYGON);
            glVertex3f(0.0, 0.0, 0.0);
            glVertex3f(0.5, 0.0, 0.0);
            glVertex3f(0.5, 0.5, 0.0);
            glVertex3f(0.0, 0.5, 0.0);
        glEnd();
        glFlush();
    }

    int main(int argc, char** argv)
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE);
        glutInitWindowSize(300, 300);
        glutInitWindowPosition(100, 100);
        glutCreateWindow("Hello world :D");
        glutDisplayFunc(displayMe);
        glutMainLoop();
        re

turn 0;
}
Вот мои ошибки компоновщика:
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x25):
> undefined reference to `__imp___glutInitWithExit'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x4c):
> undefined reference to `__imp___glutCreateWindowWithExit'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x72):
> undefined reference to `__imp___glutCreateMenuWithExit'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x8e):
> undefined reference to `__imp_glClear'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x9c):
> undefined reference to `__imp_glBegin'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0xb1):
> undefined reference to `__imp_glVertex3f'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0xca):
> undefined reference to `__imp_glVertex3f'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0xe7):
> undefined reference to `__imp_glVertex3f'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x100):
> undefined reference to `__imp_glVertex3f'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x109):
> undefined reference to `__imp_glEnd'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x112):
> undefined reference to `__imp_glFlush'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x14b):
> undefined reference to `__imp_glutInitDisplayMode'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x15e):
> undefined reference to `__imp_glutInitWindowSize'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x171):
> undefined reference to `__imp_glutInitWindowPosition'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x18d):
> undefined reference to `__imp_glutDisplayFunc'
> C:\Users\Exhuman\AppData\Local\Temp\ccM8iHrk.o:main.cpp:(.text+0x196):
> undefined reference to `__imp_glutMainLoop' collect2.exe: error: ld
> returned 1 exit status


Я включаю ссылку для загрузки в свою пользовательскую рабочую среду, так как считаю, что ее настройка займет слишком много времени, компоненты MinGW, Notepad++ и NppExec программы могут быть скомпилированы с помощью "f9", если нет ошибок, и аналогично могут быть запущены с помощью "ctrl f9" после компиляции. Обычно я запускаю программу с помощью файла .bat в главном каталоге.

http://www.filedropper.com/env_1

Если бы кто-нибудь мог помочь мне в этом вопросе, я был бы очень признателен.

Что я уже пробовал:

Этот сайт: http://www.transmissionzero.co.uk/computing/using-glut-with-mingw/ был самым близким, что я нашел, и я попытался связаться с автором для решения проблемы, и до сих пор он не отвечал.

Я также попытался найти MinGW и линкер, но жаргон находится вне моего понимания.

3 Ответов

Рейтинг:
2

Graeme_Grant

Я не являюсь разработчиком C++, но нашел StackOverflow Q&A[^ это должно указать вам правильное направление.


Member 13013288

Нет, безумно неспецифично и бесполезно.

Graeme_Grant

Это говорит о том, что в вашем sol'N отсутствует файл... разве это не так glut.cpp файл включен в sol'N? [edit:] "неопределенная ссылка" означает, что он не может найти то, на что ссылается в перенасыщении.f заголовочный файл. Не так уж "безумно неспецифично и бесполезно".

Member 13013288

Я понятия не имею, я скачал все файлы freeglut и установил их там, где я должен был их установить, и это проблема компоновщика, нет glut.cpp насколько мне известно, это библиотека dll. Установка моего файла сделает это более понятным

Graeme_Grant

Возможно, вам нужно проверить, как используется библиотека dll. Ошибка предполагает, что на него не ссылаются/не связываются. следите за подробным выводом компилятора/компоновщика.

Member 13013288

но это не так. вот почему мне нужна помощь. это вообще не связано. и все всегда дают очень глупые ответы.

Все, что я спрашиваю, - это как связать freeglut, чтобы я мог скомпилировать файл. Я получаю вывод, я искал ошибку, это ошибка компоновщика, она вызвана тем, что freeglut не связан с notepad++ mingw, это все, что я уже знаю.

Единственное, чего я не знаю, так это как это связать/исправить.

Graeme_Grant

Есть ли на сайте автора, откуда вы его взяли, какие-либо "инструкции по использованию и компиляции"?

[no name]

->Все всегда дают действительно глупые ответы.
Они не более не-ответы, чем это не-вопрос. Это проблема вашего собственного творения, поэтому, когда люди пытаются помочь, требуется некоторое смирение. Мы не сидим за вашим столом. Вы внимательно прочитали это и четко выполнили все шаги? Используя библиотеку freeglut или избыток с помощью MinGW[^] Причина, по которой ваш компоновщик не может найти функции, может быть одной из многих возможных.

Member 13013288

если вы скачаете мой файл, то в каталоге MinGW>freeglut есть readme.

Я не могу понять, как ему следовать.

[no name]

Никто не собирается скачивать ваши файлы и решать вашу проблему. Это форум быстрых ответов.

Graeme_Grant

Это также может помочь: 3d-проект с freeglut на языке c++[^]

Graeme_Grant

Я прочитал прилагаемые инструкции для Lib, и они очень ясны в том, что вам нужно сделать. Они даже объясняют, как компилировать с помощью g++. Все есть, вам просто нужно найти время, чтобы следовать им.

Member 13013288

- куда же?

Member 13013288

думаю, я просто буду придерживаться дерьмовой visual studio, совершенно бесполезной.

Graeme_Grant

С таким отношением вы сами по себе.

Member 13013288

это не похоже на то, что ты был полезен в любом случае Чувак, я уже имел дело с днями "это так просто, тебе просто нужно следовать этому, ха-ха, это так легко"

Это не. Это совсем не просто.

Чувак даже не объяснил, где вводить команды, как работают пути, что такое тестовые объекты, не предоставил никакого тестового скрипта, а полное руководство написано применительно к автономным mingw и C, а не c++

Это наименее простая вещь, и люди, делающие это так, как будто это просто, действительно раздражают.

Graeme_Grant

И вы удивляетесь, почему вы не можете получить правильную помощь...

Рейтинг:
1

Member 14810494

Я знаю, что этот ответ более чем на 3 года удален из первоначальной публикации, но я наткнулся на эту публикацию во время исследования и хотел предложить ответ.

Я уже сталкивался с этим типом неопределенной ссылки раньше. Это может произойти, когда вы пытаетесь связать программу, скомпилированную в режиме отладки, с библиотекой, построенной в режиме выпуска (или наоборот). Свяжитесь с правильной версией библиотеки, и проблема должна исчезнуть.

Роджер


Рейтинг:
0

VD-Flash

Here is the solution to your problem. I was experiencing the same problem as you when I first used FreeGLUT. First confirm that you have a OpenGL32 and FreeGLUT library. If you are using MinGW then these should be located in the lib directory with the names of either "libopengl32.a" and "libfreeglut.a"/"libglut32.a"(if you are using glut) or "opengl32.lib" and "freeglut.lib". The FreeGLUT library can have a different name depending on the generator but it will include the word "freeglut" in it. Now what you need to do is add those libraries to your project. If you dont know how to do that just add the following lines in your source code:

#pragma comment("lib", "*freeglut/glut имя библиотеки*")
#pragma comment("lib", "opengl32")

И будьте очень осторожны, чтобы добавить библиотеку GLUT/FreeGLUT перед библиотекой OpenGL. Выполнение обратного действия снова покажет эти ошибки. Теперь вы не должны получать неопределенную ссылку на ошибки __imp_gl*.

Теперь перейдем к ошибкам, т. е. перенасыщение __бесенок_перенасыщение* ошибки. Обратите внимание, что в каждом из них есть суффикс "WithExit". Когда вы читаете заголовок GLUT (в FreeGLUT это freeglut_std.h), то где-то в последнем вы увидите несколько строк комментария. Этот комментарий содержит решение этой проблемы. И решение состоит в том, чтобы определить макрос:

#define GLUT_DISABLE_ATEXIT_HACK

Я действительно не знаю, что это за выходная штука и почему ее нужно отключить, но после ее отключения приложение будет компилироваться, и у вас не будет никаких ошибок или неправильных функций. Также добавьте библиотеку winmm после OpenGL by:

#pragma comment ("lib", "winmm")

И теперь ваше приложение должно работать как масло как на MinGW, так и на Visual Studio.

И если вы используете FreeGLUT, то определите дополнительный макрос FREEGLUT_STATIC перед включением заголовка FreeGLUT.

Надеюсь, это поможет.


VD-Flash

Я знаю, что этому вопросу уже более 3 лет. Возможно, вы уже догадались. Но в случае, если вы этого не сделали, попробуйте и загрузите последнюю версию FreeGLUT binary release, которая является 3.2.1, с их официального сайта. Если вы поняли это даже тогда, когда есть ребята в этой проблеме, как я был когда-то, и я бы они прочитали этот ответ, то они наверняка получат некоторую помощь.