如何跟踪 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 支持的内容?
【问题讨论】:
在代码库中搜索ifstream
和ofstream
?
我已经这样做了。我很确定代码中没有 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 文件?