2013-07-12 3 views
10

Windows 7, Code :: Blocks 및 MinGW를 사용하고 있습니다. 나는 Code/Blocks가 makefile을 사용하지 않을 때 특히 컴파일/빌드에 관한 경험이 거의 없다.SDL2 라이브러리의 정적 연결

http://www.libsdl.org/tmp/download-2.0.php에서 SDL2-devel-2.0.0-mingw.tar.gz (SDL 개발 라이브러리)를 다운로드했으며 SDL2 라이브러리를 사용하여 독립 실행 형 실행 파일을 만들고 싶습니다. 그러나 지금까지 항상 SDL2.dll 파일을 실행 파일로 묶어서 작동하게하십시오.

동적 라이브러리를 정적 링크 할 수 없다는 소식을 들었으므로 링크에서 SDL2-2.0.0.tar.gz 파일 (소스 코드)을 사용하여 소스 파일로 뭔가를하고있는 것 같습니다. 나는 위에서 언급했다. 그러나, 나는 그들과 함께해야 할 일을 모른다.

Visual Studio 프로젝트를 Code :: Blocks로 가져와 빌드하는 것이 소스 파일과 함께 시도했지만 "sdl-config에는 해당 파일이나 디렉터리가 없습니다"라고 표시됩니다.). 또한 빌딩이 단순히 실행 파일을 제공하는지 여부를 확신 할 수 없습니다.이 실행 파일을 사용하면 내 실행 파일과 링크 할 수 있습니다.

바보 같은 바보의 단계 가이드가이 문제를 해결하기위한 최선의 방법 일 것입니다.

편집 :

나는 조나스가 제공하는 가이드와 함께 SDL 라이브러리를 컴파일 관리 및 libSDL2.a 파일을 얻었다.

처음에는 "Link libraries :"섹션에 Code :: Blocks 섹션을 추가했지만 "SDL_Init()"와 같은 오류가 발생했습니다.

libSDL2.a 경로 외에도 SDL2-2.0.0 \ include의 경로를 컴파일러의 검색 디렉토리에 추가하고 SDL2-2.0.0 \ build.libs의 경로를 링커의 검색에 추가했습니다 예배 규칙서. 나는 또한 이것을 테스트 파일에 작성했다 : #include "SDL.h".

선언 문제를 해결했지만 지금은 코드 :: 블록도 이상의 오류 SDL_mmjoystick.c 파일을 열어 준 나타납니다
#include "SDL.h" 

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

: " '정의되지 않은 참조를 waveInClose @ 내 테스트 파일은 이제 다음과 같습니다 4 ' ","waveOutClose @ 4 "에 대한 정의되지 않은 참조,"joyGetNumDevs @ 0 "및 기타 다수에 대한 정의되지 않은 참조 http://gyazo.com/00656a9c1e57a2bd0db1414fa7d68ced.png

내가 제대로 사용에이 라이브러리를 가지고하는 방법을 잘 모르겠습니다 :

여기에 그런 일이 왜 확실하지 않다 #include와 텍스트의 다른 색상을 참고, 무슨 일이 일어나고 있는지의 스크린 샷입니다. 이 경우 도움이 필요합니까? 아니면 다른 질문을해야합니까?

편집 :

나는 링커 옵션에 -lSDL2을 추가하고 다른 매개 변수를 삭제.

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) 

을하지만 그것을 실행하려고하면, 그것은 요점은 정적 링크에있는 동안 내 컴퓨터가 SDL2.dll 부족 말한다 : 지금은 잘 구축합니다.

그래서 현재/lib 디렉토리를 내 링크 라이브러리 -settings, -lSDL2를 다른 링커 옵션으로 빌드하고 검색 디렉토리에 대해 SDL2-2.0.0에 대한 경로/컴파일러를 포함하고 있습니다. 링커에 대한 SDL2-2.0.0/build/.libs.

build/.libs 디렉토리에서 libSDL2.a, libSDL2.dll.a, libSDL2를 볼 수도 있습니다.la와 libSDL2.lai 파일은 어떤 파일인지 알 수 없습니다.

+0

libsdl2.a를 명시 적으로 링커에 전달하는 경우'-lSDL2'를 삭제할 수 있습니다. – greatwolf

답변

14

그것은 라이브러리를 다시 컴파일 할 필요는 없습니다, SDL2는 "\ SDL2-2.0.0는 i686-W64-mingw32 \ LIB \"폴더에 "libSDL2.a" 라는 이름의 정적 연결 라이브러리와 함께 제공됩니다.

그냥 링커에이 옵션을 추가해야합니다 :

"-lmingw32 -lSDL2main -lSDL2 -mwindows -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -static-관하여 libgcc "코드에

:에서 블록"프로젝트/빌드 옵션 .../Linket 설정/기타 링커 옵션 "이 옵션은 SDL2.dll가 무엇인지에 연결할 수 있습니다

사용.

당신은 "SDL2-2.0.0의 \의는 i686-W64-mingw32의 \ 빈 \의 sdl2-설정"

마법 트릭 "libSDL2.dll.a을 삭제하거나 파일 이름을 바꿀 수있는 파일을 retreive 수 있습니다 ""SDL2-2.0.0 \ i686-w64-mingw32 \ lib \ "폴더에 있습니다. 필자는 필요할 경우를 대비하여 "-"를 추가했습니다.

나는 왜이 librairy가 다른 사람을 극복하고 단서가 인정 될지 모르겠다.

Code :: Blocks 12.11 MinGW32를 사용해 보았습니다. 동적 링크 및 정적 링크를 사용하는 다른를 사용하는 일부 프로젝트를 실행하면 "libSDL2main.a는"두에있을 것입니다 것을 알고 두 개의 서로 다른 폴더에 librairies을 유지 에

이있을 것이다 .

글쓰기에 불편을 드려 죄송 합니다만, 나는 영어로 글을 쓸 필요가 없습니다.

마이크

+6

FYI -이 문제에 대한 작업에서 링크 시간에 명령 줄에 "-static"을 추가하면 mingw 링커가 동적 라이브러리보다 정적 라이브러리를 사용하도록 강제하므로 삭제할 필요가 없음을 발견했습니다 또는 libSDL2.dll.a 파일의 이름을 변경하여 작동되게하십시오. – Syndog