在C++中存储巨大的静态变量

8
我有一串大约17kb长的信息字符串。我的程序不会生成此字符串,也不会将其读入缓冲区 - 数据已经初始化,我希望它能像静态变量一样在我的代码中编译。此外,我更希望它存在于我的可执行文件中,而不是存储在项目文件中。我以前从未遇到过这样的问题,请问最好的解决方法是什么?我应该将其作为资源包含,还是直接将巨大的数据流复制粘贴到变量中?您推荐哪种方法?(注:使用VisualStudio C++ 2015)

3
把它放在另一个cpp文件中,并在头文件中加入一个extern,这样你就可以访问它。这样一个好的构建环境就不会一直重建它。 - user4581301
这需要将它存储在另一个文件中,我不想冒文件丢失的风险,而是更喜欢直接嵌入到 .exe 文件中的能力。 - DudeDudeDude
3
在另一个**.cpp**文件中,这意味着它仍将被编译,并且忽略它将导致链接错误。 - Angew is no longer proud of SO
1
@DudeDudeDude,你应该查阅一些C++教程,了解更多关于代码编译过程的知识。 - ForceBru
我在这里非常尴尬,很抱歉,显然我需要睡觉了,因为是的,包含.cpp文件后代码将会编译。非常抱歉。您是否建议将其粘贴到变量或某种缓冲区中的.cpp文件中,或者有更好的方法从extern引用如此大量的数据?我担心复制和粘贴流可能会导致意外错误。 - DudeDudeDude
显示剩余2条评论
1个回答

3
GNU 链接器 ld 可以直接将自定义数据包含为目标文件的 .data 段:
 ld -r -b binary -o example.o example.txt

生成的example.o文件定义了访问嵌入数据的起始和结束符号(只需使用objdump查看文件即可查看它们的命名)。
现在我不知道Visual Studio附带的链接器是否具有类似的功能,但我猜您可以通过mingw或cygwin来使用GNU链接器(由于生成的目标文件不会引用标准库,因此您不需要cygwin附带的仿真库)。生成的目标文件显然可以像常规源文件一样添加到您的源代码中
当然,如果数据经常更改,这种手动工作流程并不好...
或者,您可以编写一个简单的程序,将文件内容放入C字符串中,例如:
unsigned char const * const data = { 
  0x12, 0x34, 0x56 };

当然,已经有这样一个程序(xdd),但我不知道它是否对您可用。一个潜在的问题是,您可能会通过这种方式达到字符串文字长度限制。为了解决这个问题,您可以尝试使用(多维)字符数组。
(在撰写本答案时,我发现这篇博客文章非常有帮助。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接