【问题标题】:How can I track the reason why FS is included by emscripten?如何跟踪 FS 被 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 标准输入或标准错误的引用。

标签: javascript c++ emscripten


【解决方案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 将在运行时崩溃。
  • 啊抱歉,我知道我回答的问题与您提出的问题略有不同!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多