在编译时从文件填充数组

Populate an array at compile-time from file

本文关键字:填充 数组 文件 编译      更新时间:2023-10-16

我正在为裸机环境交叉编译一个程序,我想用我存储在文件中的数据填充一个数组。有没有办法在编译时进行此读取?

原因:将数据复制粘贴到源中似乎很丑陋。

构建

过程的一部分可以是运行一个程序,该程序将文件作为输入并生成一个C++源文件,该文件将其定义为数组,如下所示:

char arrayFromFile[] = {
    0x01, 0x02, 0x99, ...  and so on
};

程序本身可能是源代码的一部分。

然后只需在构建周期的稍后阶段编译该程序即可。例如,您可能有以下makefile段:

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

GCC和Clang都可用于将任意文件作为静态字符串打包到.o中。最终,将它使用的符号名称映射到程序员认为该文件的内容(特别是如果构建中的"物理"和"逻辑"文件路径不是一回事),但此处演示了该过程的核心,忽略了极端情况, 归结为:

gcc ... -Wl,--format=binary -Wl,$FILE1 -Wl,$FILE2 ...

(使用 Bazel 作为构建工具的项目可能只能直接使用包含的 bzl 规则。