我有一个CMake项目(C++),我想通过WebAssembly在JavaScript中使用它。要配置它,我使用emcmake cmake
并构建它emmake make
。手动执行时,我可以成功编译零件:
emcc --bind test.cpp
但是我想从emmake
的优势中获利。我需要--bind
的参数emcc
。 emmake
默认不添加它,这会导致错误: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")
add_executable(...)
的可执行文件后缀