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

问题描述

TL; DR

如何配置CMake和Emscripten来构建我的静态库以生成WASM和JS引导程序文件


我有一个用CMake构建的静态库,我想使用Emscripten将其构建为WASM库(和JS引导程序)。只需使用Emscripten CMake工具链并添加适当的编译器/链接器标志,就只会生成.a文件-即使将-o <project name>.js添加到编译器和/或链接器标志中。

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

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

system_libs:警告:main()在输入文件中,但是“ _main”不在EXPORTED_FUNCTIONS中,这意味着可以将其作为无效代码消除。如果要运行main()则将其导出。

我可以通过向exe源文件列表中添加一个文件解决问题(可能我还没有尝试过),但这感觉很像黑客。

解决方法

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

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

有关如何解决cmake的限制的信息,请参见CMake: Is it possible to build an executable from only static libraries and no source?