Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CMake build使用Emscripten将libtorch编译为WebAssembly_Cmake_Static Linking_Webassembly_Emscripten_Libtorch - Fatal编程技术网

使用CMake build使用Emscripten将libtorch编译为WebAssembly

使用CMake build使用Emscripten将libtorch编译为WebAssembly,cmake,static-linking,webassembly,emscripten,libtorch,Cmake,Static Linking,Webassembly,Emscripten,Libtorch,我正在尝试使用WebAssembly在浏览器中运行我的PyTorch模型(导出到TorchScript)。为此,我需要使用Emscripten编译libtorch。正如PyTorch文档建议使用CMake作为编译器一样,我坚持使用它 我已经成功地使用CMake编译了libtorch,没有出现指定的问题。其次,我还使用Emscripten和CMake为WASM编译了一个简单的测试程序(为了简洁和关注手头的问题,我没有包含这两个文件的CMakeLists.txt文件) 当我试图同时编译这两个文件时,

我正在尝试使用WebAssembly在浏览器中运行我的PyTorch模型(导出到TorchScript)。为此,我需要使用Emscripten编译libtorch。正如PyTorch文档建议使用CMake作为编译器一样,我坚持使用它

我已经成功地使用CMake编译了libtorch,没有出现指定的问题。其次,我还使用Emscripten和CMake为WASM编译了一个简单的测试程序(为了简洁和关注手头的问题,我没有包含这两个文件的CMakeLists.txt文件)

当我试图同时编译这两个文件时,问题就开始了,下面是我的CMake文件:

set(project "wasm-example")

cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)

set(CMAKE_TOOLCHAIN_FILE $HOME/.local/share/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake)
set(CMAKE_BUILD_TYPE Debug)

project(${project})

SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_PREFIX_PATH $PWD/libtorch)

message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Using prefix path: ${CMAKE_PREFIX_PATH}")
message(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}")

include(CTest)
enable_testing()

set(SOURCE_FILES main.cpp)

# process exported functions
set(exports_string "")
list(JOIN exports "," exports_string)

# set compiler and flags
set(CMAKE_C_COMPILER emcc)
set(CMAKE_CPP_COMPILER em++)
set(CMAKE_CXX_FLAGS "-s WASM=1 -s EXIT_RUNTIME=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=\"[\"cwrap\", \"getValue\", \"setValue\"]\" ${TORCH_CXX_FLAGS}")
message(STATUS "Set CMAKE_CXX_FLAGS to: ${CMAKE_CXX_FLAGS}")

# find external target_link_libraries
find_package(Torch REQUIRED)

# specify the project
add_executable(${project} ${SOURCE_FILES})
target_link_libraries(${project} "${TORCH_LIBRARIES}")
set_property(TARGET ${project} PROPERTY CXX_STANDARD 14)
请注意,我使用的是libtorch的纯CPU发行版,启用CUDA的版本会导致更多问题,因为CUDA仅为动态版本

cmake..src
通过,但是
make
抛出几个错误:

wasm-ld: error: unknown argument: --no-as-needed
wasm-ld: error: unknown argument: --as-needed
wasm-ld: error: unknown argument: --no-as-needed
wasm-ld: error: unknown argument: --as-needed
wasm-ld: error: unknown file type: /home/max/repos/sandbox/cpp/wasm-example/libtorch/lib/libtorch_cpu.so
wasm-ld: error: unknown file type: /home/max/repos/sandbox/cpp/wasm-example/libtorch/lib/libtorch.so
显然,Emscripten在libtorch的动态特性方面遇到了一些问题,所以我的第一个问题是,是否可以使用Emscripten编译动态库?如果这是可能的,那么尝试使用Emscripten编译支持GPU的libtorch将是一件有趣的事情


更新
我尝试使用libtorch的静态纯CPU发行版进行编译,但这会导致完全相同的错误。然而,Pytorch GitHub上的一个旧GitHub刚刚恢复,声明我不是唯一一个有这个问题的人。希望这个GitHub问题能够解决我遇到的问题。

您可以在
CMakeLists.txt
中设置
CMAKE\u FIND\u ROOT\u PATH\u MODE\u包中的
,在
project()
之后,这样它将重新定义工具链的设置。但是请注意,这将是您(作为项目构建者)的责任,以确保
CMAKE_PREFIX_路径中的包适用于目标平台。是的,这是一种比编辑Emscripten.CMAKE更好的方法-谢谢。然而,在本例中,我仍然停留在第2部分,我看到您正在手动将emcc设置为工具链和编译器。你试过使用吗?像这样使用:
emcmakecmake../src
然后
emmake make
您可以在
CMakeLists.txt
中设置
cmake\u FIND\u ROOT\u PATH\u MODE\u包中
,在
project()
之后,它将重新定义工具链的设置。但是请注意,这将是您(作为项目构建者)的责任,以确保
CMAKE_PREFIX_路径中的包适用于目标平台。是的,这是一种比编辑Emscripten.CMAKE更好的方法-谢谢。然而,在本例中,我仍然停留在第2部分,我看到您正在手动将emcc设置为工具链和编译器。你试过使用吗?像这样使用:
emcmakecmake../src
然后
emmake make