我正在尝试将一本书编成我的可执行文件。
这本书必须编译成我的可执行文件。我无法读取文件或其他数据库管理系统。
目前,我将本书的文本放在单个头文件中,该文件具有返回文本字符串的函数。
问题是这个头文件长47,000+行,4MB +大。
我尝试在main.cpp文件中测试此文件,如下所示:
#include "MyBook.h"
int main(int argc, char** argv)
{
auto myBookStr = MyBook_ToString();
loadMyBook(myBookStr);
}
使用VS2012 64位版本编译时出现以下错误:
致命错误C1063:编译器限制:编译器堆栈溢出
解决此问题的最佳方法是什么?在我的脑海中,我唯一能想到的就是将标题拆分为多个文件,并在每个文件中返回一个字符串。是否有更优雅的解决方案来编译大型头文件?
答案 0 :(得分:4)
当人们将数据放入头文件时,我真的很讨厌。
如果必须将数据编译到可执行文件中,请将所有数据移动到源文件中。
例如:
book.cpp:
const char Book1_text[] =
"Four score and seventy years ago"
" our forefathers came to this island"
" to consume our every byte of data"
//...
" and thus ends my book."
<强> book.hpp:强>
#ifndef BOOK_HPP
#define BOOK_HPP
extern const char Book1_text[];
#endif // BOOK_HPP
源文件允许您只在内容发生变化时编辑一次然后编译数据。
将数据放入标题时,包含标题的每个文件都会获取数据并编译标题。如果我对其中一个源文件进行了更改,则书籍数据会再次编译,因为它位于头文件中。
您真的需要在您的可执行文件中包含数据吗?
可以在程序之外的文本文件中吗?
它可以在数据库中吗?
编辑1:
您可以将本书拆分为章节,并将每章作为单独的数据语句,或者甚至作为单独的文件中的单独数据语句。
分解为章节允许您创建指向章节的指针数组。这将有助于索引和推进更容易。如果你需要进入第9章,只需转到索引中的插槽9并拔出指针。 : - )
在许多商店中,他们不是手工输入所有数据语句,而是创建一个小型应用程序,它接受一个源(如文本文件)并将其转换为C语句。这样可以更容易地更新原始文本文件(一次),然后简单地生成数据语句。否则,文本编辑的传播变得笨拙。
答案 1 :(得分:0)
我意识到这已经是4年了。我最终采用的解决方案是增加文件的宽度并缩短文件的长度。
示例: MyBook最初是大约5万行文本,我试图在一个cpp文件中进行编译。通过增加字符串宽度,我可以将此长度减少到仅250行代码。 MSVC和GCC / Clang对单行有字符限制。通过每行最多写入16000个字符宽度的文本,我能够减少文件长度。一旦这样做,文件就会很快编译,并且不会遇到编译器堆栈溢出的情况。