2012-06-27 28 views
5

Vấn đề nằm trong tiêu đề, tôi sẽ cố gắng liệt kê những gì tôi đã thử và dưới đây.Biên dịch chương trình OpenGL 4.0 tĩnh đơn giản sử dụng MinGW, freeglut và glew

Trước tiên, theo hiểu biết của tôi, để sử dụng OpenGL 4.0 trên cửa sổ, bạn phải mở rộng và bỏ qua thư viện cửa sổ mặc định vì nó chỉ xuất OpenGL 1.1.

Vì vậy, chúng tôi đã cài đặt MinGW tại C:/MinGW/. Tiếp theo, tôi thiết lập FreeGLUT bằng cách tải xuống tarball từ project site. Trích xuất và biên dịch bằng cách chạy các makefiles theo số instructions với bổ sung nhỏ --prefix vào lệnh ./configure.

./configure --prefix=/c/Users/Owner/root/ 
make all 
make install 

Bây giờ tôi có freeglut trong /c/Users/Owner/root/lib/, /c/Users/Owner/root/include/ v.v. Tiếp theo là GLEW, con tôi vấn đề như xa như tôi có thể nói.

Tải xuống kho lưu trữ nguồn từ the project site (direct 1.7.0.zip link). Biên dịch phức tạp hơn một chút, công thức hiện tại của tôi bắt nguồn từ câu hỏi tràn ngăn xếp "Building glew on windows with mingw". Mẫu viết tắt được liệt kê bên dưới:

mkdir lib/ 
mkdir bin/ 
gcc -DGLEW_NO_GLU -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.o -c src/glew.c 
gcc -shared -Wl,-soname,libglew32.dll -Wl,--out-implib,lib/libglew32.dll.a -o lib/glew32.dll src/glew.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32 
ar cr lib/libglew32.a src/glew.o 
gcc -DGLEW_NO_GLU -DGLEW_MX -O2 -Wall -W -Iinclude -DGLEW_BUILD -o src/glew.mx.o -c src/glew.c 
gcc -shared -Wl,-soname,libglew32mx.dll -Wl,--out-implib,lib/libglew32mx.dll.a -o lib/glew32mx.dll src/glew.mx.o -L/mingw/lib -lglu32 -lopengl32 -lgdi32 -luser32 -lkernel32 
ar cr lib/libglew32mx.a src/glew.mx.o 

và phải được chạy từ "gốc" của /path/to/glew-1.7.0/.


Bây giờ với việc thiết lập thư viện "hoàn thành" (giả định không có lỗi ...), chương trình đơn giản của tôi được thực hiện với dòng này.

${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -lfreeglut_static -lopengl32 -lwinmm -lgdi32 -lglew32 -I ${ROOTPATH}/include -L ${ROOTPATH}/lib --static 

Bây giờ, hãy phân tích một chút và xem lý do tại sao tôi có các đối số "phụ" khác và để cho bạn biết lỗi và vấn đề nào tôi đã gặp phải và giải quyết.

  1. -DFREEGLUT_STATIC-lfreeglut_static được sử dụng thay cho bình thường -lfreeglut như chúng ta muốn có một build tĩnh ở đây. Việc không thực hiện điều này sẽ cho phép các lỗi liên kết liên quan đến freeglut.
  2. -DGLEW_STATIC được thêm vào vì lý do tương tự.
  3. -lwinmm được thêm vào để sửa lỗi trình liên kết: freeglut_init.c:(.text+0x5d9): undefined reference to '[email protected]'.
  4. -lgdi32 được thêm vào để sửa chữa các lỗi liên kết: c:/Users/Owner/root//lib\libfreeglut_static.a(freeglut_init.o):freeglut_init.c:(.text+0x58c): undefined reference to '[email protected]'

Bây giờ tôi đang bối rối với lỗi mối liên kết sau đây:

c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0x83e8): undefined reference to `[email protected]' 
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa1b2): undefined reference to `[email protected]' 
c:/Users/Owner/root//lib\libglew32.a(glew.o):glew.c:(.text+0xa290): undefined reference to `[email protected]' 

Các trường hợp thử nghiệm tối thiểu mà tạo ra lỗi này (main.cpp) là.

#include <GL/glew.h> 
#include <GL/freeglut.h> 

int main(int argc, char **argv) { 
    glEnableVertexAttribArray(0); 
} 

Ý tưởng?

+2

Hãy thử thêm -lopengl32 cuối cùng trên dòng để biên dịch chương trình của bạn và xem nó có giúp ích hay không. EDIT: Có lẽ nên được -freeglut_static như genpfault nói, tôi đọc quá nhanh. – Jite

+1

@Jite Điều đó hoạt động! (trên trường hợp kiểm tra tối thiểu) O.o Hãy làm cho câu trả lời này để tôi có thể upvote và chấp nhận nó. Tôi không thể tin rằng tôi quản lý để bỏ lỡ một sự kết hợp của GCC args như tôi đã cố gắng khoảng 12 bộ khác nhau! Thậm chí tốt hơn nếu bạn hoặc ai đó có thể cung cấp một số thông tin về _how_ để chọn thứ tự thư viện khác với các kết hợp thử ngẫu nhiên. – nixeagle

+0

Rất vui khi nó hoạt động! Tôi nghĩ người khác sẽ phải giải thích sâu hơn, nhưng từ những gì tôi hiểu, sửa tôi nếu tôi sai, đó là về bóng, như thể bạn có hai thư viện xác định một hàm có cùng tên, người cuối cùng liên kết sẽ kết thúc bóng trước. – Jite

Trả lời

4

Hãy thử thêm -lopengl32 cuối cùng trên dòng để biên dịch chương trình của bạn và xem nó có giúp ích hay không.

1

Thứ tự đối số có ý nghĩa với các tùy chọn liên kết gcc.

Hãy thử điều này:

${G++} -DFREEGLUT_STATIC -DGLEW_STATIC -m32 main.cpp -o main.exe -I ${ROOTPATH}/include -L ${ROOTPATH}/lib -lopengl32 -lwinmm -lgdi32 -lglew32 -static -lfreeglut_static 

Ngoài ra, tôi không nghĩ rằng có một tùy chọn đúp dash --static, chỉ -static.

Và trên win32, bạn sẽ cần một thành công glewInit() trước khi con trỏ chức năng glEnableVertexAttribArray() của bạn sẽ hợp lệ. Sau khi kiểm tra phiên bản và/hoặc phần mở rộng cốt lõi của bạn, tất nhiên :)

+1

Điều đó bổ sung thêm nhiều khiếu nại về 'undefined reference to '_wglGetProcAddress @ 4'. Có lẽ nên nói rằng tôi đã chơi với thứ tự đối số. Những gì tôi có trong câu hỏi là tập hợp các đối số cho số tiền ít nhất của thư rác GCC. – nixeagle

+0

Có vẻ như cả công việc '--static' và' -static'. Tôi đã sử dụng '--static' như một tùy chọn dạng dài. – nixeagle

+1

Theo như 'glewInit()' đi, vâng tôi biết. Tôi đặt một testcase * tối thiểu * để tạo ra lỗi liên kết. Tôi sợ nếu tôi đặt 25 hoặc 50 dòng mã C++, mọi người sẽ tập trung vào mã. Bằng cách giảm xuống chỉ còn 6 dòng tạo ra lỗi liên kết, tôi dường như đã nhận được phản hồi nhanh hơn và chính xác hơn. Btw mã thực tế hoạt động tốt cho tôi trên linux;). Những gì thực sự giải quyết vấn đề cửa sổ của tôi đang di chuyển '-lopengl32' đến cuối danh sách đối số gcc. Xem các bình luận của tôi bên dưới câu hỏi để đáp ứng với Jite. – nixeagle