2014-03-25 165 views
3

我想在使用minGW的Windows上使用GLEW和GLFW開發一個openGL應用程序。在當前目錄中,project/,我有目錄src/,bin/glfw-3.0.4.bin.WIN64/。我在src/目錄中有文件test.cpp,glew.h,glew.cwglew.h鏈接GLFW與minGW時未定義的參考錯誤gcc

目錄./glfw-3.0.4.bin.WIN64/include/包含GLFW/glfw3.h頭文件。

該目錄./glfw-3.0.4.bin.WIN64/lib-mingw/包含glfw3.dll,glfw3dll.alibglfw3.a

我的主文件,test.cpp包含,

#include "glew.h" 
#include "GLFW/glfw3.h" 

#include <stdio.h> 

int main(int argc, char** argv) { 
    printf("Hello, World!\n"); 

    glewInit(); 
    glfwInit(); 
} 

我通過運行(分成兩行的可讀性)

gcc -DGLEW_STATIC -DGLFW_DLL -o ./bin/test ./src/*.cpp ./src/glew.c 
-I ./glfw-3.0.4.bin.WIN64/include/ -L ./glfw-3.0.4.bin.WIN64/lib-mingw/ -lglfw3 -lopengl32 

編譯從project/目錄下的程序,我正在以下錯誤:

undefined reference to `_imp_glfwInit' 

我覺得有問題m與我不正確地鏈接GLFW庫。據我所知,包括編譯選項-lglfw3將告訴gcc鏈接./glfw-3.0.4.bin.WIN64/lib-mingw/glfw3.dll,其中包含glfwInit()的定義。

我看過類似於我的其他問題的解決方案,他們建議諸如將dll文件複製到源/二進制目錄以及更改-l選項的順序等,但沒有一個似乎解決了問題爲了我。

+0

你的gcc命令分成兩行。爲了清晰起見,這裏的可讀性如何?或者那是你的實際命令(在這種情況下,它是錯誤的)?另外,我還記得''Ipath'和'-Lpath'必須寫無空格。 – keltar

+0

是的,對不起,我應該注意到gcc命令是爲了可讀性而拆分的。不使用空格運行該命令仍會產生相同的錯誤。 – recreate

+0

不能肯定地說,但我想你的圖書館有些問題。你確定它們兼容mingw,應該是64bit嗎?你能用32位版本運行嗎? – keltar

回答

0

你的問題是,gcc遵循嚴格的庫命名約定。它試圖找到glfw3.dll.a,但找不到(因爲它被命名爲glfw3dll.a - 簡單重命名將解決您的問題)。

下一步它尋找libglfw3.a,併成功 - 但它是一個靜態庫,而在頭文件中聲明爲動態的引用(棘手的窗口DECLSPECs ...這個問題在例如linux上不存在)。所以,它找不到_imp__glfwInit,因爲在靜態庫中它只被稱爲glfwInit,所以你得到一個錯誤。

刪除libglfw3.a也是選項之一 - 在這種情況下,海灣合作委員會將進一步尋找並最終找到glfw3.dll並使用它。