2009-12-15 2 views
6

Qt와 함께 제공되는 것과 같은 C++ 용 플랫폼 독립적 리소스 시스템이 있습니까 (Qt 종속성은 없음)?Qt 리소스 시스템과 같은 플랫폼 독립적 리소스 시스템

내 C++ 소스 코드에서 임의의 데이터에 액세스하고 싶습니다. 즉, 아이콘뿐 아니라 번역 또는 쉐이더 (shaders) 등도 가능합니다.

대체로 액세스 할 가상 파일 시스템 라이브러리. ZIP 압축 파일 또는 그와 같은 것도 내 필요에 맞을 것입니다.

+0

실행 파일에 리소스를 포함해야합니까? 그렇지 않다면 다른 경로가 SQLite를 사용하여 파일을 저장할 수 있습니다.이 가벼운 데이터베이스로 실행하면 너무 많은 노력을 기울이지 않을 것입니다. – Rob

+0

유사 : http://stackoverflow.com/questions/549031/how-do-you-include-images-as-resources-in-a-c-executable – Rob

답변

8

기본적으로 많은 파일 (HTML, CSS, JS, PNG 등)을 가져 와서 static const char*으로 인코딩 된 데이터가 포함 된 C++ 헤더를 만든 C++ 웹 서버 프로젝트에 대한 자체 시스템을 롤백했습니다. 그런 다음 #include 헤더에 데이터 액세스 권한이 필요합니다. '리소스'파일을 인코딩하는 앱은 빌드 전 단계로 실행됩니다. 인코딩 응용 프로그램 자체는 boost::filesystem을 사용하여 리소스 헤더를 만들었으므로 Windows/* nix에서 작동합니다.

일반적인 리소스 파일은 다음과 같습니다 나는 \x 표기법을 사용하여 인코딩 바이너리 컨텐츠를 들어

namespace resource 
{ 
    // Generated from mainPage.htm 
    static const char* mainPage_[] = 
    { 
    "<html>...</html>" 
    }; 
} 

. 또한 데이터를 줄 바꿈하여 편집기에서 읽을 수 있도록합니다.

필자는 MS 컴파일러가 static const char*이 PITA 인 64Kb보다 클 수 없다고 생각합니다. 다행히도 이보다 더 큰 유일한 파일은 JavaScript 파일이었습니다. 작은 크기로 쉽게 나눌 수있었습니다 - 큰 이미지는 문제가 될 수 있습니다.

+0

그리고 그 이유는 무엇입니까? –

+4

크로스 플랫폼 Qt와 같은 자원 시스템을 찾을 수 없기 때문에 그 이유가 있습니다. 나는 그 질문에 현명한 대답을했고 당신은 나를 싫어 했나요? 감사! – Rob

0

우리는 여기에 ICU ResourceBundle을 사용하고 있으며 꽤 만족합니다.

pkgdata tool을 사용하면 ResourceBundle 패키지가 매우 유연합니다. 공유 라이브러리, 정적 라이브러리 또는 ICU가 메모리 맵핑 할 수있는 파일입니다.

0

나는 이진 블로 브로 (binary blob)로 링크 타임에 실행 파일 끝에 패치를 적용했다. 마지막 4 바이트는 이전 블록의 크기이며, 프로그램은 테일에서 데이터 항목을 읽습니다.

더 많은 파일 시스템 유형 구조가 필요하다면 다른 접근법이 있습니다. (시도하지는 않았지만) 모든 것을 zip 파일에 넣고 끝까지 추가하는 것이 좋습니다. 다시 한번 더 쉽게 추가 된 데이터의 findabale 크기가 필요합니다.