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

Posted

技术标签:

【中文标题】如何跟踪 FS 被 emscripten 包含的原因?【英文标题】:How can I track the reason why FS is included by emscripten? 【发布时间】:2016-07-28 15:56:19 【问题描述】:

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

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

我正在编译的代码不应该做 I/O,我想优化编译后的 javascript 的大小。我努力删除了所有 I/O 代码,但一定有一些东西需要 FS 支持。

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

【问题讨论】:

在代码库中搜索ifstreamofstream? 我已经这样做了。我很确定代码中没有 C++ 流。我还定义了 NDEBUG 来禁用断言的输出。似乎在某处仍有对 stdout 标准输入或标准错误的引用。 【参考方案1】:

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

我能想到的唯一方法是反复“平分”代码。以仍然可以编译的方式注释掉大约一半,并检查输出是否包含文件系统代码。如果不是,则注释掉的一半导致了问题。如果是,则未注释的一半(也许不是唯一的)导致了问题。您选择导致问题的那一半,然后重复。

通过这种方式,您可以尝试“放大”导致包含 FS 代码的部分。

我过去曾使用过类似的方法来放大我不熟悉的大型 C++ 代码库中的链接器错误。

【讨论】:

再次感谢。我会这样做,尽管我希望有一个更简单的解决方案。 作为记录,我发现std::random_device是导致FS被包含的原因。也许尝试解决相同问题的人可能会发现这很有用。【参考方案2】:

您可以尝试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]

【讨论】:

这有帮助,但我真的很想知道为什么 FS 包含在输出中。我想它在我的代码中的某处被调用,如果这段代码被执行,那么 javascript 将在运行时崩溃。 啊抱歉,我知道我回答的问题与您提出的问题略有不同!

以上是关于如何跟踪 FS 被 emscripten 包含的原因?的主要内容,如果未能解决你的问题,请参考以下文章

emscripten:我该如何解决 UnboundTypeError

如何将 emscripten 与 cmake 一起用于项目依赖项?

如何使用 Emscripten 编译的程序中的 wasm-bindgen?

Emscripten:我如何编译带有像 immintrin.h 这样的内在头文件的 c 文件?

如何将用 python 编写的函数编译为 JavaScript (emscripten)?

Emscripten“权限被拒绝”,即使我 sudo enmake