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.
-DFREEGLUT_STATIC
và-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.-DGLEW_STATIC
được thêm vào vì lý do tương tự.-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]'
.-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?
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
@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
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