2017-02-22 36 views
8

我有一个大约17 kb长的信息字符串。我的程序不会生成这个字符串或者将它读入缓冲区 - 数据已经被初始化了,我希望它能够像我在代码中那样被编译,就像你会用静态变量一样。此外,我更喜欢它在我的可执行文件中,而不是存储在项目文件中。我以前从未遇到过这样的问题,解决这个问题的最佳方法是什么?我是否应该将资源包含在内,或者将大量数据复制并粘贴到变量中?你会推荐什么?在C++中存储巨大的静态变量

忘记提到,使用的VisualStudio C++ 2015正在如果该事项

+3

坚持在另一个cpp文件的把一个外部的头,所以你可以访问它。这样一个体面的建设环境不会重建它。 – user4581301

+0

这需要将它存储在另一个文件中,我不希望文件被放错地方的风险,并希望能够直接嵌入.exe – DudeDudeDude

+3

@DudeDudeDude在另一个**'.cpp' **文件中意味着它仍然会被编译和省略它会给你链接错误。 – Angew

回答

3

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非常有帮助。)