2013-07-18 47 views
5

我想從GLFW的文檔編譯一個例子。我需要幫助,試圖編寫一個簡單的例子GLFW與MinGW

我對庫和源文件的文件夾結構是:

C:\ CPP \

glfw3.dll glfw3dll.a libglfw3.a TEST.CPP

包括\

GLFW \

glfw3.h glfw3native.h

#include <GLFW/glfw3.h> 

int main(void) 
{ 
    GLFWwindow* window; 

    /* Initialize the library */ 
    if (!glfwInit()) 
     return -1; 

    /* Create a windowed mode window and its OpenGL context */ 
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); 
    if (!window) 
    { 
     glfwTerminate(); 
     return -1; 
    } 

    /* Make the window's context current */ 
    glfwMakeContextCurrent(window); 

    /* Loop until the user closes the window */ 
    while (!glfwWindowShouldClose(window)) 
    { 
     /* Render here */ 

     /* Swap front and back buffers */ 
     glfwSwapBuffers(window); 

     /* Poll for and process events */ 
     glfwPollEvents(); 
    } 

    glfwTerminate(); 
    return 0; 
} 

我試圖用這個命令

c:\cpp>x86_64-w64-mingw32-g++ -lglfw3 -Iinclude test.cpp -o test 

編譯它,但我得到這個錯誤:

c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lglfw3 collect2.exe: error: ld returned 1 exit status 

-v輸出:

Using built-in specs. 
COLLECT_GCC=x86_64-w64-mingw32-g++ 
COLLECT_LTO_WRAPPER=c:/users/username/gcc/bin/../libexec/gcc/x86_64-w64-ming 
w32/4.7.2/lto-wrapper.exe 
Target: x86_64-w64-mingw32 
Configured with: ../gcc-4.7.2-mingw/configure --host=x86_64-w64-mingw32 --build= 
x86_64-unknown-linux-gnu --target=x86_64-w64-mingw32 --prefix=/home/gfortran/gcc 
-home/binary/mingw32/native/x86_64/gcc/4.7.2 --with-sysroot=/home/gfortran/gcc-h 
ome/binary/mingw32/cross/x86_64/gcc/4.7.2 --with-gcc --with-gnu-ld --with-gnu-as 
--with-gmp=/home/gfortran/gcc-home/binary/mingw32/native/x86_64/gmp --with-mpfr 
=/home/gfortran/gcc-home/binary/mingw32/native/x86_64/mpfr --with-mpc=/home/gfor 
tran/gcc-home/binary/mingw32/native/x86_64/mpc --with-cloog=/home/gfortran/gcc-h 
ome/binary/mingw32/native/x86_64/cloog --with-ppl=/home/gfortran/gcc-home/binary 
/mingw32/native/x86_64/ppl --with-host-libstdcxx='-lstdc++ -lsupc++ -lm' --enabl 
e-cloog-backend=ppl --enable-targets=i686-w64-mingw32,x86_64-w64-mingw32 --enabl 
e-lto --enable-languages=c,c++,fortran --enable-libgomp --enable-threads=win32 - 
-enable-static --enable-shared=lto-plugin --enable-plugins --enable-ld=yes --ena 
ble-libquadmath --enable-libquadmath-support --disable-nls --disable-tls --disab 
le-win32-registry 
Thread model: win32 
gcc version 4.7.2 (GCC) 
COLLECT_GCC_OPTIONS='-I' 'include' '-o' 'test.exe' '-v' '-mtune=generic' '-march 
=x86-64' 
c:/users/username/gcc/bin/../libexec/gcc/x86_64-w64-mingw32/4.7.2/cc1plus.e 
xe -quiet -v -I include -iprefix c:\users\username\gcc\bin\../lib/gcc/x86_64 
-w64-mingw32/4.7.2/ -U_REENTRANT test.cpp -quiet -dumpbase test.cpp -mtune=gener 
ic -march=x86-64 -auxbase test -version -o C:\Users\username~1.ADM\AppData\Local\T 
emp\ccfe85gV.s 
GNU C++ (GCC) version 4.7.2 (x86_64-w64-mingw32) 
     compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.0.0, 
MPC version 0.9 
warning: GMP header version 5.0.5 differs from library version 5.0.1. 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 
6_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2" 
ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 
6_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/x86_64-w64-mingw32" 
ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 
6_64-w64-mingw32/4.7.2/../../../../include/c++/4.7.2/backward" 
ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 
6_64-w64-mingw32/4.7.2/include" 
ignoring nonexistent directory "/home/gfortran/gcc-home/binary/mingw32/cross/x86 
_64/gcc/4.7.2/home/gfortran/gcc-home/binary/mingw32/native/x86_64/gcc/4.7.2/lib/ 
gcc/x86_64-w64-mingw32/4.7.2/../../../../include" 
ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 
6_64-w64-mingw32/4.7.2/include-fixed" 
ignoring duplicate directory "c:/users/username/gcc/lib/gcc/../../lib/gcc/x8 
6_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/include" 
ignoring nonexistent directory "/home/gfortran/gcc-home/binary/mingw32/cross/x86 
_64/gcc/4.7.2/mingw/include" 
#include "..." search starts here: 
#include <...> search starts here: 
include 
c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../i 
nclude/c++/4.7.2 
c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../i 
nclude/c++/4.7.2/x86_64-w64-mingw32 
c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../i 
nclude/c++/4.7.2/backward 
c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include 
c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/include-fixed 

c:\users\username\gcc\bin\../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x 
86_64-w64-mingw32/include 
End of search list. 
GNU C++ (GCC) version 4.7.2 (x86_64-w64-mingw32) 
     compiled by GNU C version 4.7.2, GMP version 5.0.5, MPFR version 3.0.0, 
MPC version 0.9 
warning: GMP header version 5.0.5 differs from library version 5.0.1. 
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 
Compiler executable checksum: 0b3cd9e378660c38a8a80567400ff92f 
COLLECT_GCC_OPTIONS='-I' 'include' '-o' 'test.exe' '-v' '-mtune=generic' '-march 
=x86-64' 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x 
86_64-w64-mingw32/bin/as.exe -v -I include -o C:\Users\username~1.ADM\AppData\Loca 
l\Temp\ccQqklHV.o C:\Users\username~1.ADM\AppData\Local\Temp\ccfe85gV.s 
GNU assembler version 2.22.52 (x86_64-w64-mingw32) using BFD version (GNU Binuti 
ls) 2.22.52.20120723 
COMPILER_PATH=c:/users/username/gcc/bin/../libexec/gcc/x86_64-w64-mingw32/4. 
7.2/;c:/users/username/gcc/bin/../libexec/gcc/;c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x86_64-w64-mingw32/bin/ 
EQ_LIBRARY_PATH=c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7. 
2/;c:/users/username/gcc/bin/../lib/gcc/;C:/Users/username/gcc/x86_64-w6 
4-mingw32/lib/../lib/;c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw3 
2/4.7.2/../../../../x86_64-w64-mingw32/lib/../lib/;c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/;C:/Users/username/gcc/ 
x86_64-w64-mingw32/lib/;c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-ming 
w32/4.7.2/../../../../x86_64-w64-mingw32/lib/;c:/users/username/gcc/bin/../l 
ib/gcc/x86_64-w64-mingw32/4.7.2/../../../ 
COLLECT_GCC_OPTIONS='-I' 'include' '-o' 'test.exe' '-v' '-mtune=generic' '-march 
=x86-64' 
c:/users/username/gcc/bin/../libexec/gcc/x86_64-w64-mingw32/4.7.2/collect2. 
exe --sysroot=/home/gfortran/gcc-home/binary/mingw32/cross/x86_64/gcc/4.7.2 -m i 
386pep -Bdynamic -o test.exe C:/Users/username/gcc/x86_64-w64-mingw32/lib/.. 
/lib/crt2.o C:/Users/username/gcc/x86_64-w64-mingw32/lib/../lib/crtbegin.o - 
Lc:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2 -Lc:/users/ 
username/gcc/bin/../lib/gcc -LC:/Users/username/gcc/x86_64-w64-mingw32/lib 
/../lib -Lc:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../. 
./../../x86_64-w64-mingw32/lib/../lib -Lc:/users/username/gcc/bin/../lib/gcc 
/x86_64-w64-mingw32/4.7.2/../../../../lib -LC:/Users/username/gcc/x86_64-w64 
-mingw32/lib -Lc:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2 
/../../../../x86_64-w64-mingw32/lib -Lc:/users/username/gcc/bin/../lib/gcc/x 
86_64-w64-mingw32/4.7.2/../../.. C:\Users\username~1.ADM\AppData\Local\Temp\ccQqkl 
HV.o -lglfw3 -lstdc++ -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 - 
lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt C:/Us 
ers/username/gcc/x86_64-w64-mingw32/lib/../lib/crtend.o 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/libglfw3.a when searching f 
or -lglfw3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/glfw3.dll when searching fo 
r -lglfw3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib\libglfw3.a when searching f 
or -lglfw3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../libglfw3.a when searching for -lgl 
fw3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../glfw3.dll when searching for -lglf 
w3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../..\libglfw3.a when searching for -lgl 
fw3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/libglfw3.a when searching f 
or -lglfw3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../lib/glfw3.dll when searching fo 
r -lglfw3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../libglfw3.a when searching for -lgl 
fw3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: skipping incompatible c:/users/username/gcc/bin 
/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../glfw3.dll when searching for -lglf 
w3 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: cannot find -lglfw3 
collect2.exe: error: ld returned 1 exit status 

C:\ CPP> x86_64-w64-mingw32-g ++ -Iinclude test.cpp -o test。\ glfw3.dll

c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: i386 architecture of input file `.\glfw3.dll' is in 
compatible with i386:x86-64 output 
C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0xe): undefi 
ned reference to `glfwInit' 
C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x43): undef 
ined reference to `glfwCreateWindow' 
C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x53): undef 
ined reference to `glfwTerminate' 
C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x66): undef 
ined reference to `glfwMakeContextCurrent' 
C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x74): undef 
ined reference to `glfwSwapBuffers' 
C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x79): undef 
ined reference to `glfwPollEvents' 
C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x85): undef 
ined reference to `glfwWindowShouldClose' 
C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o:test.cpp:(.text+0x93): undef 
ined reference to `glfwTerminate' 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: C:\Users\username~1.ADM\AppData\Local\Temp\cceVroaP.o 
: bad reloc address 0x0 in section `.pdata' 
c:/users/username/gcc/bin/../lib/gcc/x86_64-w64-mingw32/4.7.2/../../../../x8 
6_64-w64-mingw32/bin/ld.exe: final link failed: Invalid operation 
collect2.exe: error: ld returned 1 exit status 

回答

2

的順序,因爲它出現在命令行中的庫是海灣合作委員會以及庫搜索路徑中尋找重要。嘗試移動-lglfw3至年底,並增加當前目錄,使用-L搜索路徑。

例如。

g++ -Iinclude test.cpp -o test.exe -L . -lglfw3 

EDIT1:從看詳細狀態輸出,似乎libglfw3.a,你有沒有跟你使用MinGW的GCC兼容。幸運的是,ld鏈接器可以直接使用dll文件。看看以下工作:

g++ -Iinclude test.cpp -o test.exe .\glfw3.dll 

另一種方法是使用你有MinGW的GCC從glfw3.dll創建一個導入庫。這有點多,因爲你需要創建一個.def文件,然後調用dlltool。

編輯2:您正在使用的mingw gcc是一個64位Windows編譯器。確保你使用的是正確的glfw3 64位庫和而不是的32位版本。 GLFW download section

+0

這也行不通,同樣的錯誤。 – caboose0013

+0

您可以添加'-v'來查看傳遞給鏈接器的內容嗎?將其添加到您的問題。 – greatwolf

+0

@ caboose0013只要排除明顯的問題,你確定'glfw3.dll,glfw3dll.a,libglfw3。一個'在'C:\ cpp'下,這就是'dir'確認的內容?而且你也從'C:\ cpp'運行命令作爲當前工作目錄? – greatwolf

0

我認爲你有一個命名問題。看來Mingw32編譯器正在尋找庫文件glfw3.dll,glfw3.a和glfw3.h。問題是你的庫文件名爲libglfw3.a。現在您需要將其重命名爲glfw3.a,以便它可以找到它。如果仍然不起作用,那麼,您需要將glfw3dll.a重命名爲glfw3.dll.a

+0

不,這是完全錯誤的。 mingw的行爲就像gcc,畢竟它只是一個gcc端口。這意味着'-l'開關會自動在'lib'前加上查找。 'libglfw3.a'被正確命名。 – greatwolf