使用 CMake 作为 .a 使用 Emscripten 而不是 .wasm + .js 构建的静态库

Static library built with CMake as .a with Emscripten instead of .wasm + .js

TL;DR

如何配置 CMake 和 Emscripten 来构建静态库以生成 WASM 和 JS bootstrap 文件?


我有一个正在使用 CMake 构建的静态库,我想使用 Emscripten 将其构建为 WASM 库(和 JS bootstrap)。简单地使用 Emscripten CMake 工具链并添加适当的 compiler/linker 标志只会生成一个 .a 文件 - 即使 -o <project name>.js 被添加到编译器 and/or 链接器标志。

原因是因为我告诉CMake我想要一个静态库,它使用CMAKE_AR来构建。 CMAKE_AR(如果未定义)在 Emscripten 工具链文件中定义为 emar,并且 emar 无法生成 .wasm.js 输出。

我已经尝试创建一个新的可执行目标,它依赖于库,否则只是设置 compiler/linker 设置。然而,这会导致 CMake 错误,因为我定义了一个没有源文件的可执行目标(它们与库目标相关联)。如果我添加存根主文件,我会收到 Emscripten 警告:

system_libs:WARNING: main() is in the input files, but "_main" is not in EXPORTED_FUNCTIONS, which means it may be eliminated as dead code. Export it if you want main() to run.

我可以通过向 exe 源文件列表添加一个空文件来绕过(可能,我没试过),但这感觉很像 hack。

您是正确的,您需要创建一个可执行目标才能生成 .wasm 文件。

如果 cmake 坚持要你创建一个虚拟源文件,因为它不理解你程序的所有代码都可以来自库,那么我想你是最好的选择。

请参阅 了解如何解决 cmake 的这一限制。