问题描述
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?。