【问题标题】:Generate wasm file using emscripten使用 emscripten 生成 wasm 文件
【发布时间】:2021-09-01 09:33:47
【问题描述】:

我想使用 emscripten 编译 SealPIR 库以生成 wasm 文件。 使用此命令时: emcmake cmake .

我收到此错误:

CMake Error at CMakeLists.txt:19 (find_package):
  By not providing "FindSEAL.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "SEAL", but
  CMake did not find one.

  Could not find a package configuration file provided by "SEAL" (requested
  version 3.2.0) with any of the following names:

    SEALConfig.cmake
    seal-config.cmake

  Add the installation prefix of "SEAL" to CMAKE_PREFIX_PATH or set
  "SEAL_DIR" to a directory containing one of the above files.  If "SEAL"
  provides a separate development package or SDK, be sure it has been
  installed.


-- Configuring incomplete, errors occurred!
See also "/home/Zied/webassembly/SealPIR/CMakeFiles/CMakeOutput.log".
emcmake: error: 'cmake . -DCMAKE_TOOLCHAIN_FILE=/home/Zied/webassembly/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake -DCMAKE_CROSSCOMPILING_EMULATOR="/home/Zied/webassembly/emsdk/node/14.15.5_64bit/bin/node"' failed (1)  

SEAL 已正确安装。当我在没有 emcmake 的情况下运行相同的命令时,它工作得很好。 这是我的 CMakeList

cmake_minimum_required(VERSION 3.10)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(SealPIR VERSION 2.1 LANGUAGES CXX)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

add_executable(main 
    main.cpp
)

add_library(sealpir STATIC
  pir.cpp
  pir_client.cpp
  pir_server.cpp
)

find_package(SEAL 3.2.0 EXACT REQUIRED)

target_link_libraries(main sealpir SEAL::seal)

【问题讨论】:

  • SEAL is correctly installed. 你也是用emscripten编译的吗?你在哪里安装的?你能找到SEALConfig.cmake文件并将路径放在这里吗?
  • @GuillaumeRacicot 是的,我使用 emscripten 编译它并为它生成了一个 libseal.a 和一个 wasm 文件。我也可以找到 SEALConfig.cmake,但我不知道如何将它链接到 SealPIR。
  • “我也可以找到 SEALConfig.cmake,但我不知道如何将它链接到 SealPIR。” - 错误信息不是解释了吗?您可以设置 SEAL_DIR 环境变量以包含具有给定脚本的目录。
  • 我这样做了,export SEAL_DIR=/home/Zied/webassembly/SEAL/native/src/cmake 我也试过emcmake cmake . -CMAKE_PREFIX_PATH=/home/Zied/webassembly/SEAL/native/src/cmake/ 但我总是遇到同样的问题
  • @Zied 请。 SEALConfig.cmake 文件的完整路径是什么?

标签: c++ cmake webassembly emscripten emcmake


【解决方案1】:

当使用工具链文件进行交叉编译时,CMake 将默认禁用系统库。它不会搜索任何目录,以避免找到与目标系统不兼容的文件。

您认为您没有使用工具链文件吗?再想一想! emcmake 对你隐藏。仔细查看错误输出。

这里您编译了 SEAL 库,但您将它安装在默认路径中,即/usr/local

我们可以告诉 CMake 在那里显式搜索,但我不推荐,但如果可行,您可以尝试:

emcmake cmake . -CMAKE_PREFIX_PATH=/usr/local

正确的解决方案是创建一个包含所有 emscripten 库的目录:

# In the SEAL build directory
emcmake cmake .. -DCMAKE_INSTALL_PREFIX=/home/anblic/webassembly/install

然后在那个目录下安装完库后,就可以将前缀路径设置在与安装路径相同的目录下:

# Assuming you're in a build/ subdirectory
emcmake cmake .. -DCMAKE_PREFIX_PATH=/home/anblic/webassembly/install

【讨论】:

  • 当我运行emcmake cmake . -CMAKE_PREFIX_PATH=/usr/local/lib/cmake/SEAL 时它仍然无法正常工作,我收到此错误CMake Error: Error processing file: /app/SealPIR/MAKE_PREFIX_PATH=/usr/local/lib/cmake/SEAL。我很确定这是正确的路径,因为当我运行 cmake 时,它​​会在此处找到 SEAL //The directory containing a CMake configuration file for SEAL. SEAL_DIR:PATH=/usr/local/lib/cmake/SEAL。此外 CMakeOurput.log 包含The target system is: Emscripten - 1 - x86 The host system is: Linux - 5.4.0-74-generic - x86_64
  • @Zied 您必须将前缀路径设置为与安装前缀相同,而不是包含配置文件的目录。然后find_package 将使用前缀并从前缀路径中查找lib/cmake/SEAL/SEALConfig.cmake。这样,您可以将所有库放在相同的前缀中,并指示 CMake 在那里查找所有库。
  • 这就是为什么我写你必须使用/usr/local作为前缀路径,以及为什么在以下两个示例中我在两个前缀中放置了相同的路径。
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
相关资源
最近更新 更多