2017-02-22 3 views
8

У меня есть строка информации длиной около 17 кб. Моя программа не будет генерировать эту строку или читать ее в буфер - данные уже инициализированы, я хочу, чтобы они были скомпилированы как из моего кода, например, вы статичной переменной. Более того, я бы предпочел, чтобы он был в моем исполняемом файле и не был сохранен в файле проекта. Я никогда раньше не сталкивался с такой проблемой, каков наилучший способ обойти это? Должен ли я включать в качестве ресурса или буквально копировать и вставлять огромный поток данных в переменную? Чтобы вы посоветовали?Хранение огромных статических переменных в C++

забыл упомянуть, я использую VisualStudio C++ 2015, если это имеет значение

+3

Палка это в другом CPP Файловые поместить экстерном в заголовке, так что вы можете получить доступ к нему. Таким образом, достойная строительная среда не будет перестраивать ее. – user4581301

+0

Это требует, чтобы он хранился в другом файле, я не хочу, чтобы риск был неуместным и предпочли бы возможность встроить непосредственно в .exe – DudeDudeDude

+3

@DudeDudeDude В другом ** файле '.cpp' **, который означает, что он все равно будет скомпилирован и будет опущен, это даст вам ссылку на ошибки. – Angew

ответ

3

ГНУ линкер ld имеет возможность непосредственно включать в себя пользовательские данные как .data секции объектного файла:

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

Результирующий example.o файл имеет символы, определенные для доступа к началу и концу встроенных данных (просто посмотрите на файл с objdump, чтобы узнать, как они названы).

Теперь я не знаю, имеет ли компоновщик, идущий с Visual Studio, аналогичную возможность, но я думаю, вы могли бы использовать компоновщик GNU либо через mingw, либо также через cygwin (так как сгенерированный объектный файл не будет ссылаться на стандарт lib вам не понадобится эмулятор lib, который поставляется с cygwin). Полученный объектный файл apparently can just be added to your sources like a regular source file.

Конечно, это ручной рабочий процесс не слишком хорошо, если данные изменения часто ...

В качестве альтернативы вы можете написать простую программу, которая помещает содержимое файла в строке C, как:

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

Конечно, есть такая программа (xdd), но я не знаю, доступна ли она вам. Одна из потенциальных проблем заключается в том, что вы могли бы reach the limit for the length of string literals that way. Чтобы обойти это, вы можете попробовать массив (многомерный) char.

(При написании ответа я нашел this blog post очень полезно.)

Смежные вопросы