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

emcc --bind test.cpp
但是我想从emmake的优势中获利。我需要--bind的参数emccemmake默认不添加它,这会导致错误:
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);
}

最佳答案

原来,您可以使用 emcc CMakeLists.txt文件中传递set_target_properties(...)选项:CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(MyTest)
add_executable(mytest test.cpp)
set_target_properties(mytest PROPERTIES LINK_FLAGS "--bind")
这种方法几乎适用于所有参数,但-o参数可控制输出文件:
  • 如果要更改输出的名称,请更改目标的名称。
  • 如果要更改输出的目录,请在执行set(EXECUTABLE_OUTPUT_PATH subdir/for/emscripten)之前将add_executable(...)更改为可执行输出路径
  • 如果要更改输出的文件类型,请在执行set(CMAKE_EXECUTABLE_SUFFIX ".mjs")
  • 之前根据自己的needs更改带有add_executable(...)的可执行文件后缀

    10-08 11:53