2015-10-12 135 views
1

我正嘗試通過windows API創建OpenGL上下文。 現在一切都很好,但我無法弄清楚如何與正確的庫鏈接以獲得wgl ..函數的訪問權限。對wgl函數的未定義引用

我用MinGW編譯。和一個make文件。 我試圖鏈接: -lmingw32 -mwindows -lgdi32 -lopengl32 沒有運氣來解決這個問題。

我是#include windows.h和gl.h,但都不包含wgl函數? 我錯過了什麼?

以下是我的WM_CREATE事件代碼部分(這是唯一重要的事情)。

case WM_CREATE: 
    { PIXELFORMATDESCRIPTOR pfd = 
     { 
      sizeof(PIXELFORMATDESCRIPTOR), 
      1, 
      PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, //Flags 
      PFD_TYPE_RGBA,   //The kind of framebuffer. RGBA or palette. 
      32,      //Colordepth of the framebuffer. 
      0, 0, 0, 0, 0, 0, 
      0, 
      0, 
      0, 
      0, 0, 0, 0, 
      24,      //Number of bits for the depthbuffer 
      8,      //Number of bits for the stencilbuffer 
      0,      //Number of Aux buffers in the framebuffer. 
      PFD_MAIN_PLANE, 
      0, 
      0, 0, 0 
     }; 

     // Get current handle to device context. 
     HDC hDc = GetDC(hWnd); 

     // Generate pixel format. 
     int wPf = ChoosePixelFormat(hDc, &pfd); 

     // Set pixel format. 
     SetPixelFormat(hDc, wPf, &pfd); 

     // OpenGL context 
     HGLRC GLc = wglCreateContext(hDc); 

     // Make it current. 
     wglMakeCurrent(hDc, GLc); 

     break; 
    } 

這裏是我的make文件:

CXX = g++ 
SRC = engine.cpp os.cpp 
DST = build/engine.exe 
PATHS = -L c:\MinGW\lib -I c:\MinGW\include 
FLAGS = -mwindows 
LIBS = -lmingw32 -opengl32 

$(DST): $(SRC) 
    $(CXX) -o $(DST) $(FLAGS) $(PATHS) $(SRC) $(LIBS) 
+0

傳遞給鏈接器問題的庫的順序。請顯示完整的鏈接器調用。 – datenwolf

+0

我使用我在帖子中寫下的確切順序。 MinGW部分提到。 –

+0

是的,但這只是故事的一半。整個鏈接器的調用很重要;這意味着我們還必須查看將鏈接的目標文件(或直接編譯爲可執行文件)的方式和位置傳遞給源文件的行。 – datenwolf

回答

1

你的問題就在這裏:

$(DST): $(SRC) 
    $(COMPILER) $(FLAGS) $(PATHS) $(LIBS) -o $(DST) $(SRC) 

一般與舊式GNU鏈接,符號必須在出臺文件引用它們的文件。你最後有源文件,這通常會導致鏈接混亂。嘗試重新排序是這樣的:

$(DST): $(SRC) 
    $(CXX) -o $(DST) $(FLAGS) $(PATHS) $(SRC) $(LIBS) 

BTW:我們從來不叫Makefile中變量「編譯」,因爲可能有一些差異的編譯器被用於單個項目。保存C++編譯器可執行文件名稱的變量通常稱爲CXX(並且C編譯器由Makefiles中的變量CC命名)。

+0

謝謝你的makefile提示。我知道makefile中的變量用法。我現在只是爲了我自己的目的而這樣做(學習以便我的頭腦學會將它們想象爲在什麼地方)。 可悲的是這些修復程序對wgl問題沒有影響:( –