В интересах потомства, я поделюсь решением, которое я использовал в конечном итоге.На высоком уровне решение состоит в том, чтобы скомпилировать рассматриваемый ресурс в двоичный файл приложения, что устраняет необходимость также копировать его для объединения ресурсов.
Я решил, что общий и надежный способ компилировать любые данные файла в двоичный файл - это сохранить содержимое файла в статическом байтовом массиве в заголовочном файле.Предполагая, что уже есть заголовочный файл, созданный и добавленный к статической цели lib, я сделал следующий скрипт bash, чтобы прочитать файл и записать его содержимое в виде байтового массива шестнадцатеричных литералов с синтаксисом C.Затем я запускаю сценарий в фазе сборки «Run Script» перед фазами сборки «Исходники компиляции» и «Копии заголовков»:
#!/bin/bash
# Hexify.sh reads an input file, and hexdumps its contents to an output
# file in C-compliant syntax. The final argument is the name of the array.
infile=$1
outfile=$2
arrayName=$3
fileSize=$(stat -f "%z" $infile)
fileHexString=$(hexdump -ve '1/1 "0x%.2x, "' $infile)
prefix=$arrayName
suffix="Size"
variableName=$arrayName$suffix
nullTermination="0x00"
echo "//" > $headerFile
echo "// This file was automatically generated by a build script." >> $headerFile
echo "// Do not modify; the contents of this file will be overwritten on each build." >> $headerFile
echo "//" >> $headerFile
echo "" >> $headerFile;
echo "#ifndef some_arbitrary_include_guard" >> $headerFile
echo "#define some_arbitrary_include_guard" >> $headerFile
echo "" >> $headerFile
echo "static const int $variableName = $((fileSize+1));" >> $outfile
echo "static const char $arrayName[$variableName] = {" >> $outfile
echo -e "\t$fileHexString$nullTermination" >> $outfile
echo "};" >> $outfile
echo "#endif" >> $headerFile
Так, например, если у меня есть пример файла ресурсов.txt:
Hello this
is a file
И я должен был запустить ./Hexify.sh example.txt myHeader.h exampleArray
, заголовок будет выглядеть так:
//
// This file was automatically generated by a build script.
// Do not modify; the contents of this file will be overwritten on each build.
//
#ifndef some_arbitrary_include_guard
#define some_arbitrary_include_guard
static const int exampleArraySize = 21;
static const char exampleArray[exampleArraySize] = {
0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0a,
0x69, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x00
};
#endif
Теперь, в любой момент времени, когда я бы загрузил указанный ресурсиз основного пакета я могу вместо этого обратиться к массиву байтов в этом заголовочном файле.Обратите внимание, что моя версия скрипта добавляет завершающий байт, который делает данные пригодными для создания строковых объектов.Это может применяться не во всех случаях.
В качестве одного из заключительных дополнений, я прошу прощения, если этот скрипт bash заставит кого-то из настоящих программистов bash съежиться;Я почти не знаю, что я делаю с Bash.