我正在为emscripten编译一些C ++代码。我注意到emscripten包含一大段代码来支持文件系统操作。根据emscripten的文档,包含此代码是因为已编译的C ++调用I / O函数。否则,就不会有。这是文档的相关部分:
Emscripten决定是否包含文件系统支持 自动。许多程序不需要文件和文件系统支持 大小不可忽略不计,因此Emscripten避免将其包括在内 没有理由。这意味着如果您的C / C ++代码没有 访问文件,然后FS对象和其他文件系统API不会 被包括在输出中。而另一方面,如果你的C / C ++代码 确实使用文件,然后文件系统支持将自动 包括在内。所以通常事情会“正常工作”,你不需要 想想这一点。
我编译的代码不应该做I / O,我想优化编译的javascript的大小。我努力删除所有I / O代码,但必须留下某些需要FS支持的东西。
有没有一种简单的方法可以跟踪代码中需要FS支持的内容?
答案 0 :(得分:1)
您可以尝试NO_FILESYSTEM
编译器选项,如https://kripken.github.io/emscripten-site/docs/optimizing/Optimizing-Code.html#miscellaneous-code-size-tips
您可以使用NO_FILESYSTEM选项来禁用文件系统支持代码的捆绑(如果不使用,编译器应该优化它,但可能并不总是成功)。例如,如果要构建纯计算库,这可能很有用。有关详细信息,请参阅settings.js。
您在命令行中使用
emcc -s NO_FILESYSTEM=1 [... other stuff]
答案 1 :(得分:1)
有没有一种简单的方法可以跟踪代码中需要FS支持的内容?
我能想到的唯一方法是反复“平分”代码。以仍然编译的方式注释掉大约一半,并检查输出是否具有文件系统代码。如果不是,则注释掉的一半导致问题。如果是,则未评论的一半(可能不是唯一的)导致该问题。你拿出导致问题的一半,然后重复。
通过这种方式,您可以尝试“放大”导致包含FS代码的部分。
我过去曾使用类似的方法来放大我不熟悉的大型C ++代码库上的链接器错误。