如何跟踪emscripten包含FS的原因?

时间:2016-07-28 15:56:19

标签: javascript c++ emscripten

我正在为emscripten编译一些C ++代码。我注意到emscripten包含一大段代码来支持文件系统操作。根据emscripten的文档,包含此代码是因为已编译的C ++调用I / O函数。否则,就不会有。这是文档的相关部分:

  

Emscripten决定是否包含文件系统支持   自动。许多程序不需要文件和文件系统支持   大小不可忽略不计,因此Emscripten避免将其包括在内   没有理由。这意味着如果您的C / C ++代码没有   访问文件,然后FS对象和其他文件系统API不会   被包括在输出中。而另一方面,如果你的C / C ++代码   确实使用文件,然后文件系统支持将自动   包括在内。所以通常事情会“正常工作”,你不需要   想想这一点。

我编译的代码不应该做I / O,我想优化编译的javascript的大小。我努力删除所有I / O代码,但必须留下某些需要FS支持的东西。

有没有一种简单的方法可以跟踪代码中需要FS支持的内容?

2 个答案:

答案 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 ++代码库上的链接器错误。