我有一个大约17 kb长的信息字符串。我的程序不会生成这个字符串或者将它读入缓冲区 - 数据已经被初始化了,我希望它能够像我在代码中那样被编译,就像你会用静态变量一样。此外,我更喜欢它在我的可执行文件中,而不是存储在项目文件中。我以前从未遇到过这样的问题,解决这个问题的最佳方法是什么?我是否应该将资源包含在内,或者将大量数据复制并粘贴到变量中?你会推荐什么?在C++中存储巨大的静态变量
忘记提到,使用的VisualStudio C++ 2015正在如果该事项
我有一个大约17 kb长的信息字符串。我的程序不会生成这个字符串或者将它读入缓冲区 - 数据已经被初始化了,我希望它能够像我在代码中那样被编译,就像你会用静态变量一样。此外,我更喜欢它在我的可执行文件中,而不是存储在项目文件中。我以前从未遇到过这样的问题,解决这个问题的最佳方法是什么?我是否应该将资源包含在内,或者将大量数据复制并粘贴到变量中?你会推荐什么?在C++中存储巨大的静态变量
忘记提到,使用的VisualStudio C++ 2015正在如果该事项
GNU链接ld
有能力直接包括作为对象文件的.data
部分的自定义数据:
ld -r -b binary -o example.o example.txt
将所得example.o
文件具有定义用于访问嵌入数据开始和结束的符号(只需查看objdump
以查看它们的名称)即可。
现在我不知道与Visual Studio一起提供的链接器是否具有类似的功能,但我猜你可以通过mingw或通过cygwin使用GNU链接器(因为生成的对象文件不会引用标准lib你不需要cygwin自带的模拟库)。生成的目标文件apparently can just be added to your sources like a regular source file。
当然,这手动工作流程不太好,如果数据经常变化......
或者你可以写一个简单的程序,把文件的内容在一个C字符串,如:
unsigned char const * const data = {
0x12, 0x34, 0x56 };
当然,已经有这样一个程序(xdd
),但我不知道它是否可用。一个潜在的问题是,你可以reach the limit for the length of string literals that way。为了解决这个问题,你可以尝试一个(多维)char数组。
(在写这个答案我发现this blog post非常有帮助。)
坚持在另一个cpp文件的把一个外部的头,所以你可以访问它。这样一个体面的建设环境不会重建它。 – user4581301
这需要将它存储在另一个文件中,我不希望文件被放错地方的风险,并希望能够直接嵌入.exe – DudeDudeDude
@DudeDudeDude在另一个**'.cpp' **文件中意味着它仍然会被编译和省略它会给你链接错误。 – Angew