[Bug]: WASM code not support clone
oatgnauh opened this issue · comments
Describe the issue
I am tring to compile gtest source code using emscripten to get wasm code.
But I get a link error:
[ 20%] Built target gtest [ 30%] Linking CXX executable testgtest.js em++: warning: -pthread + ALLOW_MEMORY_GROWTH may run non-wasm code slowly, see https://github.com/WebAssembly/design/issues/1271 [-Wpthreads-mem-growth] wasm-ld: error: lib/libgtest.a(gtest-all.cc.o): undefined symbol: clone em++: error: '/media/compiler/harddisk/emsdk/upstream/bin/wasm-ld -o testgtest.wasm CMakeFiles/testgtest.dir/main.cpp.o lib/libgtest.a -L/media/compiler/harddisk/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten /media/compiler/harddisk/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/crtbegin.o -lGL-mt -lal -lhtml5 -lstubs-debug -lnoexit -lc-mt-debug -ldlmalloc-mt -lcompiler_rt-mt -lc++-mt-noexcept -lc++abi-debug-mt-noexcept -lsockets-mt -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --allow-undefined-file=/tmp/tmp8cg2r8bb.undefined --import-memory --shared-memory --strip-debug --export-if-defined=main --export-if-defined=_emscripten_thread_init --export-if-defined=_emscripten_thread_exit --export-if-defined=_emscripten_thread_crashed --export-if-defined=_emscripten_tls_init --export-if-defined=pthread_self --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__start_em_lib_deps --export-if-defined=__stop_em_lib_deps --export-if-defined=__start_em_js --export-if-defined=__stop_em_js --export-if-defined=__main_argc_argv --export-if-defined=fflush --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_get_current --export=emscripten_stack_init --export=stackSave --export=stackRestore --export=stackAlloc --export=__errno_location --export=emscripten_dispatch_to_thread_ --export=_emscripten_thread_free_data --export=emscripten_main_runtime_thread_id --export=emscripten_main_thread_process_queued_calls --export=_emscripten_run_in_main_runtime_thread_js --export=emscripten_stack_set_limits --export=__get_temp_ret --export=__set_temp_ret --export=malloc --export=free --export=__wasm_call_ctors --export=ntohs --export=htons --export=htonl --export=__cxa_is_pointer_type --export=__cxa_free_exception --export=__cxa_can_catch --export=setTempRet0 --export=emscripten_builtin_memalign --export-table -z stack-size=65536 --initial-memory=16777216 --no-entry --max-memory=2147483648 --stack-first' failed (returned 1) make[2]: *** [CMakeFiles/testgtest.dir/build.make:88:testgtest.js] 错误 1 make[1]: *** [CMakeFiles/Makefile2:138:CMakeFiles/testgtest.dir/all] 错误 2 make: *** [Makefile:130:all] 错误 2 emmake: error: 'make' failed (returned 2)
which indicate that clone
function is undefined
Since I don't need process clone, and also process clone is not support by emscripten, I believe it is a good choice to remove the related code calls clone
in Web platform. Which under macro define __wasm__
Steps to reproduce the problem
here is my CMakeLists.txt.
cmake_minimum_required(VERSION 3.6)
project("testgtest")
set(CMAKE_CXX_STANDARD 17)
add_definitions(-DGTEST_OS_LINUX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s WASM=1 -s FORCE_FILESYSTEM=1 -s ALLOW_MEMORY_GROWTH=1 -s USE_PTHREADS=1 -s ENVIRONMENT=web,worker")
add_subdirectory(/media/compiler/harddisk/cpp/VESDK-ToolSet/PAT/deps/googletest gtest)
include_directories(/media/compiler/harddisk/cpp/VESDK-ToolSet/PAT/deps/googletest/include)
add_executable(
testgtest
${CMAKE_CURRENT_SOURCE_DIR}/main.cpp
)
target_link_libraries(
testgtest
gtest
pthread
)
main.cpp
#include <gtest/gtest.h>
#include "emscripten/emscripten.h"
TEST(MathTest, AddTest) {
int a = 2;
int b = 3;
int result = a + b;
ASSERT_EQ(result, 5);
}
TEST(MathTest, MultiplyTest) {
int a = 2;
int b = 3;
int result = a * b;
ASSERT_EQ(result, 6);
}
int EMSCRIPTEN_KEEPALIVE main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
you have to install emsdk to compile this.here I am using emsdk 3.1.34
What version of GoogleTest are you using?
Release 1.11.0
What operating system and version are you using?
Linux rubbish 5.15.0-91-generic #101~20.04.1-Ubuntu SMP Thu Nov 16 14:22:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
What compiler and version are you using?
emsdk 3.1.34, which including clang.
What build system are you using?
cmake version 3.16.3
Additional context
No response
By the way, I fix this error by giving an empty implement of clone
library-xx.js
mergeInto(LibraryManager.library, {
clone: function(fn, stack, flags, arg, ext) {
console.warn("not support clone on web!!")
},
// end of custom
});
passing --js-library pathto/library-xx.js
to CMAKE_CXX_FLAGS
Since we don't need it, and never using it
Release 1.11.0 is pretty old. Does it work in the latest version?
Closing due to no response to the question about the version. Please re-open if this is still and issue.