Moberg
Moberg

Reputation: 5519

Populate an array at compile-time from file

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

Answers (2)

BCS
BCS

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

paxdiablo
paxdiablo

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

Related Questions