2013-07-12 53 views
10

Tôi đang sử dụng Windows 7, Mã :: Blocks và MinGW. Tôi có ít hoặc không có kinh nghiệm khi nói đến biên dịch/xây dựng bất cứ điều gì, đặc biệt là khi Code :: Blocks không sử dụng makefiles.Liên kết tĩnh các thư viện SDL2

Tôi đã tải xuống SDL2-devel-2.0.0-mingw.tar.gz (Thư viện phát triển SDL) từ http://www.libsdl.org/tmp/download-2.0.php và tôi muốn tạo một tệp thực thi độc lập bằng cách sử dụng thư viện SDL2, nhưng đến nay tôi luôn phải bó tệp SDL2.dll với tệp thực thi để làm cho nó hoạt động.

Tôi đã nghe nói rằng tôi không thể liên kết tĩnh các thư viện động, do đó, tùy chọn duy nhất của tôi dường như đang làm điều gì đó với các tệp nguồn bằng tệp SDL2-2.0.0.tar.gz (Mã nguồn) từ liên kết Tôi đã đề cập ở trên. Tuy nhiên, tôi không biết mình nên làm gì với những người đó.

Những gì tôi quản lý để thử với tệp nguồn đang nhập dự án Visual Studio vào Code :: Blocks và xây dựng nó, nhưng nó cho tôi biết "sdl-config Không có tệp hoặc thư mục nào" (Tôi không biết điều gì đã kích hoạt). Tôi cũng không chắc liệu việc xây dựng chỉ mang lại cho tôi một tệp thực thi, mà tôi không biết tôi có thể làm gì để liên kết nó với tệp thực thi của riêng tôi.

Hướng dẫn từng bước của người đánh lừa bằng chứng ngốc sẽ là đặt cược tốt nhất để giải quyết trường hợp này.

EDIT:

tôi quản lý để lập thư viện SDL với hướng dẫn Jonas cung cấp, và có một tập tin libSDL2.a.

Lúc đầu, tôi chỉ thêm đường dẫn của libSDL2.a vào "Thư viện liên kết:" -section của Code :: Blocks, nhưng tôi có một loạt lỗi như "SDL_Init() không được khai báo trong phạm vi này".

Ngoài đường dẫn libSDL2.a, tôi cũng thêm đường dẫn của SDL2-2.0.0 \ include vào thư mục tìm kiếm của trình biên dịch cũng như đường dẫn của SDL2-2.0.0 \ build.libs vào tìm kiếm của Trình tìm kiếm danh mục. Tôi cũng đã viết điều này vào tệp thử nghiệm của mình: #include "SDL.h". tập tin thử nghiệm của tôi bây giờ trông như thế này:

#include "SDL.h" 

int main(int argc, char* args[]) { 
    //Start SDL 
    SDL_Init(SDL_INIT_EVERYTHING); 
    //Quit SDL 
    SDL_Quit(); 
    return 0; 
} 

Có vẻ nó đã khắc phục vấn đề khai, nhưng bây giờ Code :: Blocks mở một tập tin SDL_mmjoystick.c và đã cho tôi thậm chí nhiều lỗi: "tài liệu tham khảo không xác định để 'waveInClose @ 4 '"," tham chiếu không xác định đối với' waveOutClose @ 4 '"," tham chiếu không xác định đối với' joyGetNumDevs @ 0 '"và tấn các tham số khác.

Dưới đây là một ảnh chụp màn hình về những gì đang xảy ra, lưu ý các màu sắc khác nhau của văn bản #include, tôi không chắc chắn lý do tại sao điều đó xảy ra: http://gyazo.com/00656a9c1e57a2bd0db1414fa7d68ced.png

Tôi không chắc chắn làm thế nào để đúng thư viện này vào sử dụng. Bất kỳ sự giúp đỡ nào trong trường hợp này, hay tôi nên đưa ra một câu hỏi khác cho nó?

EDIT:

Tôi đã thêm -lSDL2 vào tùy chọn trình liên kết và xóa các thông số khác. Bây giờ nó xây dựng tốt:

mingw32-g++.exe -Wall -fexceptions -g -IC:\Users\User\Desktop\SDL2-2.0.0\include -c "C:\Users\User\Desktop\CppProjects\SDL project\main.cpp" -o obj\Debug\main.o 
mingw32-g++.exe -Wall -fexceptions -g -IC:\Users\User\Desktop\SDL2-2.0.0\include -c "C:\Users\User\Desktop\CppProjects\SDL project\thetestfile.cpp" -o obj\Debug\thetestfile.o 
mingw32-g++.exe -LC:\Users\User\Desktop\SDL2-2.0.0\build\.libs -o "bin\Debug\SDL project.exe" obj\Debug\main.o obj\Debug\thetestfile.o -lSDL2 ..\..\SDL2-2.0.0\build\.libs\libSDL2.a C:\Users\User\Desktop\SDL2-2.0.0\build\.libs\libSDL2.a -mwindows 
Output size is 945.80 KB 
Process terminated with status 0 (0 minutes, 1 seconds) 
0 errors, 0 warnings (0 minutes, 1 seconds) 

Nhưng khi tôi cố gắng chạy nó, nó nói máy tính của tôi thiếu SDL2.dll, trong khi toàn bộ điểm là liên kết tĩnh.

Vì vậy, hiện tại tôi có đường dẫn để xây dựng/.lib trong các thư viện Liên kết của tôi -settings, -lSDL2 trong tùy chọn Trình liên kết khác và tìm kiếm thư mục tôi có đường dẫn đến SDL2-2.0.0/include cho trình biên dịch và SDL2-2.0.0/build/.libs cho trình liên kết.

Trong thư mục build/.libs Tôi cũng có thể xem libSDL2.a, libSDL2.dll.a, libSDL2.Các tệp la và libSDL2.lai, mà tôi không biết chúng là gì.

+0

Nếu bạn chuyển libsdl2.a một cách rõ ràng cho trình liên kết, bạn có thể thả '-lSDL2'. – greatwolf

Trả lời

14

Không cần phải biên dịch lại thư viện, SDL2 được cung cấp với thư viện liên kết tĩnh có tên "libSDL2.a" trên thư mục "SDL2-2.0.0 \ i686-w64-mingw32 \ lib \".

Chỉ cần chắc chắn để thêm các tùy chọn này để mối liên kết:

"-lmingw32 -lSDL2main -lSDL2 -mwindows -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -static-libgcc"

trên Code: Blocks tại "Dự án/Build Options .../cài đặt Linket/options mối liên kết khác"

Các tùy chọn này cho phép bạn liên kết với những gì SDL2.dll là sử dụng.

Bạn có thể truy xuất chúng trên tập tin "SDL2-2.0.0 \ i686-w64-mingw32 \ bin \ sdl2-config"

Bí quyết kỳ diệu là để xóa hoặc đổi tên tập tin "libSDL2.dll.a " trên thư mục" SDL2-2.0.0 \ i686-w64-mingw32 \ lib \ ". Tôi đã thêm dấu "-" trước để giữ trong trường hợp tôi cần.

Tôi không biết lý do tại sao sự lừa đảo này vượt qua sự khác và một đầu mối sẽ được đánh giá cao.

Tôi đã thử với Mã :: Blocks 12.11 MinGW32 và nó hoạt động.

Nếu bạn chạy với một số dự án có sử dụng liên kết động và một số khác sử dụng tĩnh-link, bạn sẽ phải giữ librairies của bạn trong hai thư mục khác nhau khi biết rằng "libSDL2main.a" sẽ nằm trong hai .

Xin lỗi vì bài viết của tôi, tôi không quen viết tiếng Anh.

Mike

+6

FYI - Khi làm việc với vấn đề này, tôi phát hiện ra rằng nếu bạn thêm "-static" vào dòng lệnh tại thời gian liên kết, nó sẽ buộc trình liên kết mingw ưu tiên thư viện tĩnh trên động, vì vậy bạn không phải xóa hoặc đổi tên tệp libSDL2.dll.a để làm cho nó hoạt động. – Syndog

Các vấn đề liên quan