簡體   English   中英

帶有Eclipse CDT + MinGW + GLEW + GLFW的OpenGL:未定義的引用

[英]OpenGL with Eclipse CDT + MinGW + GLEW + GLFW: Undefined References

編輯:在此期間,我已經弄清楚了,並在下面寫了詳細的答案。

我只是嘗試從Win7的Express版本的MSVC 10切換到Eclipse CDT,並且在配置時遇到了以下簡單OpenGL代碼的問題(在Visual Studio中可以正常工作):

#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>

int main()
{
    GLFWwindow* w;

    if (!glfwInit())
        return -1;

    w = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (!w)
    {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(w);

    glewExperimental = true;
    if (glewInit() != GLEW_OK)
    {
        return -1;
    }

    while (!glfwWindowShouldClose(w))
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glfwSwapBuffers(w);
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

在Visual Studio中,我包括GLFW和GLEW的庫路徑,並按順序鏈接(除了VS內置的東西之外)opengl32.lib,glew32s.lib,glfw3.lib。

現在,如果我在Eclipse CDT中執行相同的操作,則無法使其正常工作。 發生以下錯誤:

Info: Internal Builder is used for build
g++ "-LD:\\lib\\cpp\\glfw-3.0.1.bin.WIN32\\lib-mingw" "-LD:\\lib\\cpp\\glew-1.10.0binaries\\lib\\Release\\Win32" -o glfwcheck.exe main.o -lopengl32 -lglew32s -lglfw3 
Warning: .drectve `/DEFAULTLIB:"LIBCMT" /DEFAULTLIB:"OLDNAMES" ' unrecognized
D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj):(.text[__glewInit_GL_VERSION_1_2]+0x4): undefined reference to `_imp__wglGetProcAddress@4'
D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj):(.text[__glewInit_GL_VERSION_1_3]+0x4): undefined reference to `_imp__wglGetProcAddress@4'
d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: D:\lib\cpp\glew-1.10.0binaries\lib\Release\Win32/glew32s.lib(tmp/glew_static/Release/Win32/glew.obj): bad reloc address 0x4 in section `.text[__glewInit_GL_VERSION_1_3]'
d:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/ld.exe: final link failed: Invalid operation
collect2.exe: error: ld returned 1 exit status

當然,我嘗試更改三個庫的順序,但這只會使情況更糟。 (順便說一句:我覺得很奇怪,我無法重現以上錯誤,因此當我將庫重新排列為初始順序時,它們是唯一的錯誤。我會保持20多個錯誤,直到刪除所有庫為止,構建並再次添加。)

在摸索並瀏覽了論壇帖子之后,我發現GLEW二進制文件可能存在問題,因此我自己使用MinGW對其進行了編譯。 僅這次,我得到了所有“未找到”的錯誤。 我不知道如何靜態鏈接到我自己編譯的GLEW,因為現在不再有glew32s.lib,只有libglew32.a和libglew32mx.a。 與glew32動態鏈接並將dll放入我的項目文件夾也不起作用。

我覺得我在Eclipse中做錯了什么,或者只是忘了一些其他的庫(盡管我曾經嘗試過將VS使用的所有庫都放在那里,並且它仍然做同樣的事情)。

你能幫我嗎? :)否則,我想我必須呆在VS上,或者改用Linux + make。

我已經弄清楚了,對於任何遇到此問題的人,我都會盡力弄清楚我到底做了什么,最終能夠使用設置MinGW + GLEW + GLFW創建OpenGL項目。 就我而言,我將Eclipse CDT用作IDE,但是我將寫下生成的g++命令行,因此應該很容易適應其他IDE。

  1. 我假設安裝了MinGWMSYS (可以選擇從MinGW GUI中安裝;因此無需單獨下載)。

  2. 下載GLFW並將其解壓縮到您選擇的外部庫文件夾中(在我的情況下,這是D:\\external\\cpp ,因此它類似於D:\\external\\cpp\\glfw ,我將其重命名為glfw-3.0.3.bin.WIN32文件夾(只需glfw )。

  3. GLEW 下載為zip文件夾並解壓縮,在我的情況下,它位於D:\\external\\cpp\\glew 現在啟動MSYS ,將cd轉到glew文件夾並調用make all

  4. 步驟3應該已經在文件夾glew\\lib創建了libglew32.aglew32.dll文件。 現在,右鍵單擊Eclipse CDT C ++項目,轉到Properties-C / C ++ General-Paths and Symbols 在“ 包含”選項卡中,將路徑添加到GLFW和GLEW的include文件夾。 同樣,對我來說,這是D:\\external\\cpp\\glew\\include ,與GLFW類似。 在“ 庫路徑”中 ,對文件夾lib (GLEW)和lib-mingw (GLFW)進行相同的操作。

  5. 現在,我們必須添加要與我們的項目鏈接的庫。 如果希望動態鏈接GLEW,請確保將glew32.dll包含在可執行文件所在的文件夾中。 在Eclipse CDT中,通常是項目結構中的Debug (或Release )文件夾。 在我們之前打開的選項窗口的選項卡中,添加(順序很重要!) glfw3glew32opengl32glu32gdi32 現在,該項目的建設應該可以進行。 如果要與GLEW靜態鏈接,請添加相同的庫,但glew32 而是在項目屬性中轉到C / C ++ Build-設置,然后在工具設置 libglew32.a C ++鏈接器-其他選項卡中,將libglew32.a的路徑添加到Other objects字段。 就我而言,這是D:\\external\\cpp\\glew\\lib\\libglew32.a 現在,為了使靜態鏈接起作用,您必須在#include <GL/glew.h>上方添加#define GLEW_STATIC或使用預處理程序命令-DGLEW_STATIC GLEW主頁說,還可以在您的項目中包含glew.cglew.h文件,以便進行靜態鏈接,但是對於我來說,這實際上並沒有奏效。

這些步驟對我有用,它們產生的命令行類似於以下內容(我只有一個名為main.cpp文件,並使用GLEW進行靜態鏈接),如果您試圖在沒有Eclipse CDT的情況下解決此問題,這可能會很有用。

g++ -ID:\external\cpp\glew\include -ID:\external\cpp\glfw\include -c -o main.o main.cpp
g++ -LD:\external\cpp\glew\lib -LD:\external\cpp\glfw\lib-mingw -o minimalexample.exe main.o D:\external\cpp\glew\lib\libglew32.a -lglfw3 -lopengl32 -lglu32 -lgdi32

在動態鏈接的情況下,簡單地去除含部libglew32.a在第二行中,並添加-lglew32之間-lglfw3-lopengl32 作為一個小示例源文件,您可以只使用上述問題中的代碼。

我希望我能為任何人提供幫助,因為我肯定看到我在解決數十個未解析符號的錯誤消息與其他各種問題之間遇到很多麻煩:-)

更新:幾天前,我試圖再次進行檢查,並遇到了適用於Windows的預編譯GLFW二進制文件的問題(我現在使用的是Win8.1)。 但是,您可以僅將CMakemingw32-make結合使用來自行編譯。 另外,GLEW似乎不再獲得更新,所以我改而高興了 也可以使用MinGW-w64將庫和最終項目編譯為64位應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM