Reputation: 5519
I am cross compiling a program for a bare-metal environment and I want to have an array populated with the data I have stored in a file. Is there a way to do this read during compile-time?
Reason: Copy-pasting the data into the source seems ugly.
Upvotes: 8
Views: 1149
Reputation: 78683
Both GCC and Clang can be used to pack arbitrary files into a .o
as static strings. There ends up being a bit of complexity around mapping what symbol names it uses to what the programmer thinks of that file as (particularly if the "physical" and "logical" file paths in the build are not the same thing), but the core of the process is demonstrated here and, ignoring corner cases, boils down to:
gcc ... -Wl,--format=binary -Wl,$FILE1 -Wl,$FILE2 ...
(Projects that uses Bazel as their build tool may be able to just use the containing bzl rule directly.)
Upvotes: 1
Reputation: 882406
Part of your build process can be to run a program which takes the file as input and generates a C++ source file which defines it as an array, something like:
char arrayFromFile[] = {
0x01, 0x02, 0x99, ... and so on
};
The program itself could be part of your source code.
Then just compile that program later in the build cycle. For example, you may have the following makefile
segment:
generate: generate.cpp
g++ -o generate generate.cpp # build data generator
data.cpp: data.dat
generate data.dat >data.cpp # create c file with data
prog: prog.cpp data.cpp
g++ -o prog prog.cpp data.cpp # create program from source and data
Upvotes: 6