如何通过 'emcmake cmake/emmake make' 传递 'emcc' 选项?

How do I pass 'emcc' options through 'emcmake cmake/emmake make'?

我有一个 CMake 项目 (C++),我想通过 WebAssembly 在 JavaScript 中提供它。要配置它,我使用 emcmake cmake 并构建它 emmake make。当我手动执行时,我可以成功编译部分:

emcc --bind test.cpp

但我想利用emmake的优势。我需要 emcc 的参数 --bindemmake默认不添加,导致报错:

error: undefined symbol: _embind_register_function (referenced by top-level compiled C/C++ code)

那么,在使用 emmake make 构建时如何添加它?我可以将它传递给 emmake 吗?或者我可以在 CMakeLists.txt 中添加一些内容吗?


MCRE:

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(MyTest)
add_executable(mytest test.cpp)

test.cpp:

#include "emscripten/bind.h"

using namespace emscripten;

std::string getText()
{
    return "Hello there from C++!";
}

EMSCRIPTEN_BINDINGS(my_module) {
    function("getText", &getText);
}

事实证明,您可以使用 set_target_properties(...):

CMakeLists.txt 文件中传递 emcc 选项

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(MyTest)
add_executable(mytest test.cpp)
set_target_properties(mytest PROPERTIES LINK_FLAGS "--bind")

这种方法几乎适用于所有参数,除了用于控制输出文件的 -o 参数:

  • 如果要更改输出的名称,请更改目标的名称。
  • 如果要更改输出目录,请在执行add_executable(...)
  • 之前用set(EXECUTABLE_OUTPUT_PATH subdir/for/emscripten)更改可执行输出路径
  • 如果要更改输出的文件类型,请在执行add_executable(...)
  • 之前根据您的needs更改可执行文件后缀为set(CMAKE_EXECUTABLE_SUFFIX ".mjs")