Многочисленные неопределенные ссылочные ошибки при связывании freeglut и codelite (minGW32 c ++) - PullRequest
0 голосов
/ 09 мая 2019

При попытке установить (если это правильное слово) opengl на мою IDE codelite для создания программ opengl для c ++ я столкнулся с множеством неопределенных ошибок ссылок в файле freeglut_std.h, а также с такими известными функциями, как glutMainLoop (): также "неопределенный".

Таким образом, я действительно нашел определения функций в файле freeglut_std.h, и я попытался поработать с файлом заголовка, чтобы убедиться, что нет ложных условий, из-за которых мои определения не будут созданы. (например, сделать #if true ..... #endif (чтобы код наверняка выполнялся)). У меня есть опыт работы с Си, но я никогда раньше не связывал подобные файлы. Просматривая несколько веб-страниц, таких как: https://www.ntu.edu.sg/home/ehchua/programming/opengl/HowTo_OpenGL_C.html, https://www.transmissionzero.co.uk/computing/using-glut-with-mingw/ Я связал свои файлы. (Также обратите внимание, что этот вопрос задавался раньше, однако большинство постов имели разные решения, которые не работали для меня)

Итак, вот как codelite компилирует мои файлы (без ошибочного кода):

C:/mingw-w64/i686-7.3.0-posix-dwarf-rt_v5-rev0/mingw32/bin/g++.exe  -c  "C:/Users/admin/Documents/codelite/workspaces/c_plus_plus/cpp_openGL/main.cpp" -g -O0 -Wall -I"C:\mingw-w64\i686-7.3.0-posix-dwarf-rt_v5-rev0\mingw32\include"  -o ./Debug/main.cpp.o -I. -I.
C:/mingw-w64/i686-7.3.0-posix-dwarf-rt_v5-rev0/mingw32/bin/g++.exe -o ./Debug/cpp_openGL @"cpp_openGL.txt" -L.   -m32 -static-libgcc -static-libstdc++ -static -lpthread -L"C:\mingw-w64\i686-7.3.0-posix-dwarf-rt_v5-rev0\mingw32\lib" -Wl,--subsystem,windows -lfreeglut -lopengl32 -lglu32
mingw32-make.exe[1]: Leaving directory 'C:/Users/admin/Documents/codelite/workspaces/c_plus_plus/cpp_openGL'
====0 errors, 0 warnings====

Однако для чего-то подобного (фактический тестовый код):


/*
 * GL01Hello.cpp: Test OpenGL C/C++ Setup
 */

#include <windows.h>  // For MS Windows
#include <GL/glut.h>  // GLUT, includes glu.h and gl.h

/* Handler for window-repaint event. Call back when the window first appears and
   whenever the window needs to be re-painted. */
void display() {
   glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
   glClear(GL_COLOR_BUFFER_BIT);         // Clear the color buffer

   // Draw a Red 1x1 Square centered at origin
   glBegin(GL_QUADS);              // Each set of 4 vertices form a quad
      glColor3f(1.0f, 0.0f, 0.0f); // Red
      glVertex2f(-0.5f, -0.5f);    // x, y
      glVertex2f( 0.5f, -0.5f);
      glVertex2f( 0.5f,  0.5f);
      glVertex2f(-0.5f,  0.5f);
   glEnd();

   glFlush();  // Render now
}

/* Main function: GLUT runs as a console application starting at main()  */
int main(int argc, char** argv) {
   glutInit(&argc, argv);                 // Initialize GLUT
   glutCreateWindow("OpenGL Setup Test"); // Create a window with the given title
   glutInitWindowSize(320, 320);   // Set the window's initial width & height
   glutInitWindowPosition(50, 50); // Position the window's initial top-left corner
   glutDisplayFunc(display); // Register display callback handler for window re-paint
   glutMainLoop();          // Enter the infinitely event-processing loop
   return 0;
}

Я получаю следующие ошибки:

./Debug/main.cpp.o: In function `glutInit_ATEXIT_HACK':
C:/mingw-w64/i686-7.3.0-posix-dwarf-rt_v5-rev0/mingw32/include/GL/freeglut_std.h:623: undefined reference to `_imp____glutInitWithExit@12'
./Debug/main.cpp.o: In function `glutCreateWindow_ATEXIT_HACK':
C:/mingw-w64/i686-7.3.0-posix-dwarf-rt_v5-rev0/mingw32/include/GL/freeglut_std.h:625: undefined reference to `_imp____glutCreateWindowWithExit@8'
./Debug/main.cpp.o: In function `glutCreateMenu_ATEXIT_HACK':
C:/mingw-w64/i686-7.3.0-posix-dwarf-rt_v5-rev0/mingw32/include/GL/freeglut_std.h:627: undefined reference to `_imp____glutCreateMenuWithExit@8'
./Debug/main.cpp.o: In function `main':
C:/Users/admin/Documents/codelite/workspaces/c_plus_plus/cpp_openGL/main.cpp:32: undefined reference to `_imp__glutInitWindowSize@8'
C:/Users/admin/Documents/codelite/workspaces/c_plus_plus/cpp_openGL/main.cpp:33: undefined reference to `_imp__glutInitWindowPosition@8'
C:/Users/admin/Documents/codelite/workspaces/c_plus_plus/cpp_openGL/main.cpp:34: undefined reference to `_imp__glutDisplayFunc@4'
C:/Users/admin/Documents/codelite/workspaces/c_plus_plus/cpp_openGL/main.cpp:35: undefined reference to `_imp__glutMainLoop@0'
collect2.exe: error: ld returned 1 exit status
====7 errors, 0 warnings====

Файл, на который он жалуется, - freeglut_std.h, из файла скопировано следующее:

#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK) && !defined(__WATCOMC__)
FGAPI void FGAPIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
FGAPI int FGAPIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int));
FGAPI int FGAPIENTRY __glutCreateMenuWithExit(void (* func)(int), void (__cdecl *exitfunc)(int));
#ifndef FREEGLUT_BUILDING_LIB
#if defined(__GNUC__)
#define FGUNUSED __attribute__((unused))
#else
#define FGUNUSED
#endif
static void FGAPIENTRY FGUNUSED glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }//<--has problem with
#define glutInit glutInit_ATEXIT_HACK
static int FGAPIENTRY FGUNUSED glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); }//<--has problem with
#define glutCreateWindow glutCreateWindow_ATEXIT_HACK
static int FGAPIENTRY FGUNUSED glutCreateMenu_ATEXIT_HACK(void (* func)(int)) { return __glutCreateMenuWithExit(func, exit); } //<--has problem with
#define glutCreateMenu glutCreateMenu_ATEXIT_HACK
#endif
#endif

#ifdef __cplusplus
    }
#endif

Обратите внимание, что я могу избавиться от 3 неопределенных ссылок:

#define GLUT_DISABLE_ATEXIT_HACK

Однако оставшиеся ошибки все еще существуют.

Последнее замечание в freeglut_std.h: существуют следующие строки (это не определения)

FGAPI void    FGAPIENTRY glutInit( int* pargc, char** argv );
FGAPI void    FGAPIENTRY glutInitWindowPosition( int x, int y );
FGAPI void    FGAPIENTRY glutInitWindowSize( int width, int height );
FGAPI void    FGAPIENTRY glutInitDisplayMode( unsigned int displayMode );
FGAPI void    FGAPIENTRY glutInitDisplayString( const char* displayMode );

И что-то должно работать, так как оно не жалуется на

glutinit(param...)
glutCreateWindow(param...)

UPDATE
Я должен сообщить вам, что у меня есть файл freeglut.dll, сохраненный в той же папке, что и мое приложение. Однако это не должно иметь значения, потому что я также пробовал использовать статическую сборку белого цвета. Я использовал -DFREEGLUT_STATIC в команде complier и связал -lfreeglut_static Это привело к тому же результату, за исключением того, что часть ошибки _imp_ пропала.

Короче говоря, я здесь ошеломлен, любая помощь всегда очень ценится.
(п.с. прошу избавить меня от модов).

...