2017-02-22 16 views
8

Mam ciąg informacji o długości około 17 kb. Mój program nie wygeneruje tego ciągu ani nie odczyta go w buforze - dane są już zainicjalizowane, chcę, aby zostały skompilowane tak, jak z mojego kodu, tak jakbyś miał statyczną zmienną. Co więcej, wolałbym, żeby znajdował się w moim pliku wykonywalnym i nie był przechowywany w pliku projektu. Nigdy wcześniej nie spotkałem się z takim problemem, jaki jest najlepszy sposób obejścia tego? Czy powinienem dołączyć jako zasób, lub dosłownie skopiować i wkleić ogromny strumień danych do zmiennej? Co byś polecił?Przechowywanie ogromnych zmiennych statycznych w C++

Zapomniałem wspomnieć, używam VisualStudio C++ 2015, jeśli się liczy

+3

stick to w innym KPP plik programu umieścić extern w nagłówku, dzięki czemu można do niego dostęp. W ten sposób przyzwoite środowisko kompilacji nie będzie kontynuowało jego odbudowy. – user4581301

+0

Wymaga to zapisania go w innym pliku, nie chcę ryzyka, że ​​pliki zostaną zgubione i wolałabym możliwość osadzania bezpośrednio w pliku .exe – DudeDudeDude

+3

@DudeDudeDude W innym pliku '' .cpp' **, który oznacza, że ​​nadal byłby on wkompilowany, a pominięcie go spowodowałoby błędy w linkowaniu. – Angew

Odpowiedz

3

GNU łącznik ld ma możliwość bezpośrednio zawierać niestandardowe dane jako części .data z pliku obiektu:

ld -r -b binary -o example.o example.txt 

Powstały example.o plik ma symbole zdefiniowane w celu uzyskania dostępu do początku i końca osadzonych danych (wystarczy spojrzeć na plik z numerem objdump, aby zobaczyć, jak się nazywa).

Teraz nie wiem, czy linker przychodzący z Visual Studio ma podobną zdolność, ale przypuszczam, że można użyć łącznika GNU poprzez mingw lub też przez cygwin (ponieważ wygenerowany plik obiektowy nie odwoła się do standardu lib nie będziesz potrzebować biblioteki emulacji dołączonej do cygwin). Powstały plik obiektowy apparently can just be added to your sources like a regular source file.

Oczywiście ta instrukcja workflow nie jest zbyt dobre, jeśli zmiany danych często ...

Alternatywnie można napisać prosty program, który stawia zawartość pliku w ciąg C, jak:

unsigned char const * const data = { 
    0x12, 0x34, 0x56 }; 

Oczywiście istnieje już taki program (xdd), ale nie wiem, czy jest on dostępny. Jednym z potencjalnych problemów jest to, że możesz reach the limit for the length of string literals that way. Aby obejść to, możesz wypróbować (wielowymiarową) tablicę znaków.

(Pisząc tę ​​odpowiedź znalazłem this blog post bardzo pomocne.)

Powiązane problemy