2008-09-22 8 views
14

Windows 용 정적으로 링크 된 "단일 바이너리"버전을 제작하려고했습니다. 나는 sdl, sdl_image 및 sdl_mixer와 연결하여 차례로 몇 가지 지원 라이브러리를 가져오고 싶습니다. 불행히도 나는 그들을 cygwin/mingw/gcc를 사용하여 컴파일하고 링크 할 수있는 방법을 찾지 못했습니다. 내가 아는 한 모든 기존 공용 버전은 공유 라이브러리/dll입니다.Windows에서 SDL 게임을 정적으로 컴파일하는 방법

여기서는 라이센스에 대해 언급하지 않습니다. 소스가 공개되므로 sdl의 GPL/LGPLness는 적절하지 않습니다.

+0

불완전성에 대한 대답이되고 싶지 않았습니다. (sdl-config 호출의 출력과 링커 오류 목록과 같은) 자세한 정보를 제공 할 수 있다면 내 대답을 수정하려면 –

+0

sdl - 정적 - libs 반환 : "-L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mno-cygwin -mwindows" 나에게 맞는 것. 내가 줄 수있는 다른 정보 당신은 – Sec

답변

21

프로젝트를 컴파일 할 때 makefile을 두 번 변경해야합니다. 대신 sdl-config --libs

  • , sdl-config --static-libs
  • 서라운드의 사용을 사용하여 상술 한 -Wl,-Bstatic과 함께 -Wl,-Bdynamicsdl-config --static-libs한다. 이것은 정적 링크를 강제하도록 GCC에 알려주지 만, 정적 링크는 둘 사이에 지정된 라이브러리에만 적용됩니다.

처럼 메이크 현재 보이는 경우

SDLLIBS=`sdl-config --libs` 

로 변경을 :이 당신이 유닉스 계열 시스템에서 수행해야 같은 일이 실제로 있지만,

SDLLIBS=-Wl,-Bstatic `sdl-config --static-libs` -Wl,-Bdynamic 

그 Windows에서와 마찬가지로 GCC에 더 간단한 -static 플래그를 사용하면 일반적으로 Unix에서 많은 오류가 발생하지 않습니다. 내 시스템 (우분투)에

+0

최상의 답변 인 것처럼 보이기 때문에 이것을 답변으로 표시하고 있습니다. 그러나 _waveOutOpen @ 24 또는 _timeGetTime @ 0과 같은 함수에 "정의되지 않은 참조"가로드 되어도 여전히 작동하지 않습니다. – Sec

+0

@Sec 이는 SDL 정적 라이브러리에서 사용하기 때문에 가져온 요구 사항입니다. WInMM 멀티미디어 라이브러리와 몇 가지 다른 링크가 링크 라인에 추가되어야 할 것입니다. 여기 – WhozCraig

0

SDL 라이브러리가 LGPL 라이센스에 포함되어 있기 때문입니다.

라이브러리를 정적 링크하려면 (다시 컴파일하면 makefile에 해킹이 필요합니다.) 호환 가능한 오픈 소스 라이센스하에 게임을 배치해야합니다.

SDL-lib는 공유 라이브러리로 사용됩니다. SDL 라이브러리를 사용하는 대부분의 프로그램이 폐쇄 된 소스이기 때문에 SDL 라이브러리는 공유 라이브러리로 제공됩니다. 바이너리 배포판은 대부분의 사람들이 필요로하는 형태로 제공됩니다.

+1

LGPL은 매우 관대 한 라이센스이며 닫힌 소스 애플 리케이션에 정적 포함을 허용합니다 .DLL 타입 포함을 제외하고 닫힌 소스 애플 리케이션에 포함을 허용하지 않는 GPL입니다 – KPexEA

+0

afaik GPL은 어떤 종류의 연결도 허용하지 않습니다. (사용자가 LGPL 코드를 업데이트/변경할 수 있어야 함) 닫힌 소스에서 LGPL과 정적 연결 oftware는 no-no입니다. –

+3

고객이 원하는 경우 LGPL 라이브러리에 다시 링크 할 수있는 기능을 고객에게 제공하는 한, 정적으로 링크 된 바이너리를 제공 할 수 있습니다. 또한 LGPL을 포함하고 사용 된 라이브러리가이 라이센스에 해당한다고 명시해야합니다. – Artelius

2

SDL mailing list post을 통해 sdl 개발 도구에는 --static-libs 플래그와 함께 사용할 수있는 sdl-config 스크립트가 포함되어있는 것으로 보입니다.

0

나는 다음과 같은 플래그를 사용해야합니다 :

SDL, SDL _ 이미지 및 정적과 같은 종속성 많은 링크
-Wl,Bstatic -lSDL_image `sdl-config --libs` -lpng12 -lz -ltiff -ljpeg -lasound -laudio -lesd -Wl,-Bdynamic `directfb-config --libs` -lpulse-simple -lcaca -laa -ldl 

. SDL _ 이미지를 사용하는 완전히 정적 인 바이너리를 만드는 것은 좋지 않습니다. 맥박, caca, aa 및 directfb는 아마 정체 될 수있다. 나는 아직 그들을 이해할만큼 충분히 멀리 있지 않았다.

1

환경 : 7.4.2.569을 구축 VM웨어 가상 머신 윈도우 7 x64 및 장비와 우리가 DEV C + +, complilador의 g는 + + (TDM-1) 4.6.1

되면, SDL2-2.0.3의 API는 다음과 같이 설치 구성 Dev C++은 전통이 명령 행을 요구함에 따라 내가 한 일은 분명하지 않습니다.

첫 번째 문제는 Windows 7이 방법론을 변경 한 것으로 보이며 자신의 공으로 이동한다는 것입니다.목록. Ref. https://stackoverflow.com/users/464581/cheers-and-hth-alf

첫 번째 장애물이 발생한 후 SDL_platform.h는 나쁘다. 다른 곳으로 내려 갔지만 다운로드 한 위치가 기억 나지 않지만 다음 버전은 표시된 버전에서 작동하지 않습니다.

SDL2.h ls를 실행 파일의 디렉토리에 넣어야합니다.

D:\prg_desa\zsdl2>g++ bar.cpp main.cpp -o pepe1 -ID:\SDL2-2.0.3\i686-w64-mingw32\include\SDL2 -LD:\SDL2-2.0.3\i686-w64-mingw32\lib -lmingw32 -lSDL2main -lSDL2 -mwindow

드디어 컴파일 및 SDL2 테스트를 작동했습니다.

+0

당신은 소스가 : bar.cpp 이 유니 코드, #DEFINE의 유니 코드, 사용법 #include , 사용법 #include , #undef를 네임 스페이스 표준을 사용하여, 포함한다; , int wmain (int argc, wchar_t * argv []), {wostringstream text; 텍스트 "argc-1 << L"명령 줄 인수 : \ n "; for (int i = 1; i

+0

main.cpp # 포함 #include # 포함 # 포함 네임 스페이스를 사용하여 표준; int main (int argc, char * argv []) {SDL_Surface * screen; SDL_Event 이벤트; MessageBox (0, TEXT ("Pulsa el OK"), TEXT ("Hola"), MB_SETFOREGROUND); (MessageLayout()) (SDL_INIT_VIDEO) == 1 while (SDL_WaitEvent 이벤트)) {if (event.type == SDL_QUIT) 중단; } SDL_Quit(); return 0;} –