使用CMake build

问题描述

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

我已经设法使用CMake编译libtorch,而没有出现here指定的问题。其次,我还设法使用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 issue,指出我不是唯一遇到此问题的人。希望这个GitHub问题能解决我遇到的问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)