2013-07-18 66 views
5

Tôi đang cố gắng biên dịch một ví dụ từ tài liệu của GLFW.Tôi cần giúp đỡ để cố gắng biên dịch một ví dụ đơn giản cho GLFW với MinGW

cấu trúc thư mục của tôi cho các thư viện và các file nguồn là:

C: \ cpp \

glfw3.dll glfw3dll.a libglfw3.a test.cpp

bao gồm \

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; 
} 

Tôi đang cố gắng để biên dịch nó với lệnh này

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

nhưng tôi nhận được lỗi này: kết quả đầu ra

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 

Trả lời

2

Thứ tự thư viện xuất hiện trong dòng lệnh rất quan trọng đối với gcc cũng như đường dẫn tìm kiếm trong thư viện. Hãy thử di chuyển -lglfw3 đến cuối và thêm thư mục hiện tại vào đường dẫn tìm kiếm bằng cách sử dụng -L.

ví dụ:

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

Edit1: Từ nhìn vào đầu ra tình trạng tiết, có vẻ như libglfw3.a rằng bạn có là không tương thích với gcc mingw bạn đang sử dụng. May mắn thay, liên kết ld có thể hoạt động với các tệp dll trực tiếp. Xem nếu các công việc sau:

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

Việc thay thế sẽ tạo ra một thư viện nhập khẩu từ glfw3.dll sử dụng mingw gcc mà bạn có. Điều này có liên quan nhiều hơn một chút vì bạn cần tạo một tệp .def, sau đó gọi hàm dlltool.

Chỉnh sửa2: Gcc mingw bạn đang sử dụng là trình biên dịch cửa sổ 64 bit. Đảm bảo bạn đang sử dụng đúng thư viện 64 bit glfw3 và không phải phiên bản 32 bit. GLFW download section.

+0

Điều đó không có tác dụng, cùng một lỗi. – caboose0013

+0

Bạn có thể thêm '-v' để xem những gì đang được chuyển tới trình liên kết không? Thêm nó vào câu hỏi của bạn. – greatwolf

+0

@ caboose0013 Chỉ để loại trừ các vấn đề rõ ràng, bạn có chắc chắn 'glfw3.dll, glfw3dll.a, libglfw3.a' là dưới 'C: \ cpp' aka đó là những gì' dir' xác nhận? Và bạn cũng đang chạy lệnh từ 'C: \ cpp' làm thư mục làm việc hiện tại? – greatwolf

0

Tôi nghĩ bạn có vấn đề đặt tên. Có vẻ như trình biên dịch Mingw32 đang tìm kiếm các tập tin thư viện glfw3.dll, glfw3.a và glfw3.h. Vấn đề là tệp thư viện của bạn có tên là libglfw3.a. Bây giờ bạn cần đổi tên nó thành glfw3.a để nó có thể tìm thấy nó. Nếu vẫn không hoạt động thì bạn cần đổi tên glfw3dll.a thành glfw3.dll.a

+0

không, điều đó hoàn toàn sai. mingw hành động giống như gcc vì nó chỉ là một cổng gcc sau khi tất cả. Điều đó có nghĩa là '-l' chuyển đổi tự động tiền tố tra cứu bằng' lib'. 'libglfw3.a' được đặt tên chính xác. – greatwolf