如何将 emscripten 与 cmake 一起用于项目依赖项?

Mat*_*erg 5 c++ opencv cmake emscripten

所以我试图将 emscripten 移植到 WebAssembly (wasm) 一个程序,该程序在开头包含以下内容:

#include <Eigen/Geometry>
#include <boost/filesystem.hpp>
#include <dvo/core/intrinsic_matrix.h>
#include <dvo/core/surface_pyramid.h>
#include <dvo/dense_tracking.h>
#include <fstream>
#include <iostream>
#include <opencv2/opencv.hpp>
Run Code Online (Sandbox Code Playgroud)

为了轻松开始,我尝试编译一个最小的 hello world OpenCV 程序:

#include <opencv2/opencv.hpp>
#include <stdio.h>
using namespace cv;
int main(int argc, char **argv) {
  Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));
  std::cout << "M = " << std::endl << " " << M << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有以下几点CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED PATHS third-party/opencv-4.1.0/build_wasm NO_DEFAULT_PATH)
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( hello hello.cpp )
target_link_libraries( hello ${OpenCV_LIBS} )
Run Code Online (Sandbox Code Playgroud)

third-party/opencv-4.1.0/build_wasm我将 OpenCV 构建到 wasm (cf doc) 的文件夹在哪里:

python ./platforms/js/build_js.py build_wasm --build_wasm
Run Code Online (Sandbox Code Playgroud)

现在,当我emconfigure cmake ..在我的项目上运行时,它找不到 OpenCV(“找不到包配置...”)。我做错了什么,但我不知道是什么。不幸的是,有关将 emscripten 与 cmake 和依赖项一起使用的文档没有详细说明。或者这个问题可能是 OpenCV 特有的,我不知道。

编辑

完全错误:

 ~/t/w/w/build ? emconfigure cmake ..                                                  ven. 26 avril 2019 16:01:00 CEST
CMake Error at CMakeLists.txt:5 (find_package):
  Could not find a package configuration file provided by "OpenCV" with any
  of the following names:

    OpenCVConfig.cmake
    opencv-config.cmake

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


-- Configuring incomplete, errors occurred!
See also "/home/matthieu/temp/wasm/wasm-opencv/build/CMakeFiles/CMakeOutput.log".
shared:ERROR: Configure step failed with non-zero return code: 1.  Command line: cmake -DCMAKE_CROSSCOMPILING_EMULATOR="/home/matthieu/programs/emsdk/node/8.9.1_64bit/bin/node" .. -DCMAKE_TOOLCHAIN_FILE=/home/matthieu/programs/emsdk/emscripten/1.38.30/cmake/Modules/Platform/Emscripten.cmake at /home/matthieu/temp/wasm/wasm-opencv/build
Run Code Online (Sandbox Code Playgroud)

内容CMakeFiles/CMakeOutput.log

The target system is: Emscripten - 1 - x86
The host system is: Linux - 4.19.36-1-lts - x86_64
Run Code Online (Sandbox Code Playgroud)

Mat*_*erg 3

所以我终于成功地用 cmake 编译了这个例子。但它相当难看,因为我手动添加了包含文件和库以及一些GLOB. 我希望 OpenCV 在构建 wasm 库时能够提供一个OpenCVConfig.cmake包含所有依赖项设置的文件。它将允许在针对 wasm 时使用经典${OpenCV_INCLUDE_DIRS}版本。${OpenCV_LIBS}

\n\n
cmake_minimum_required( VERSION 3.1 )\nset( CMAKE_CXX_STANDARD 11 )\nproject( HelloCV )\n\n# Does not work\n# find_package( OpenCV REQUIRED PATHS third-party/opencv-4.1.0/build_wasm NO_DEFAULT_PATH)\n\n# Needed for opencv2/opencv.hpp\ninclude_directories( third-party/opencv-4.1.0/include )\n\n# Needed by opencv.hpp for opencv2/opencv_modules.hpp\ninclude_directories( third-party/opencv-4.1.0/build_wasm )\n\n# Needed by opencv_modules.hpp for every module\nfile( GLOB opencv_include_modules "third-party/opencv-4.1.0/modules/*/include" )\ninclude_directories( ${opencv_include_modules} )\n\n# Our hello world executable\nadd_executable( hello hello.cpp )\n\n# Link to opencv.js precompiled libraries\nfile( GLOB opencv_js "third-party/opencv-4.1.0/build_wasm/lib/*.a" )\ntarget_link_libraries( hello ${opencv_js} )\n
Run Code Online (Sandbox Code Playgroud)\n\n

当使用 emscripten 编译为 WebAssembly 时,这很有效:

\n\n
~/t/e/o/build \xee\x82\xb0 emconfigure cmake -DCMAKE_BUILD_TYPE=Release ..\n...\n~/t/e/o/build \xee\x82\xb0 emmake make\n...\n~/t/e/o/build \xee\x82\xb0 node hello.js\nM =\n [  0,   0, 255,   0,   0, 255;\n   0,   0, 255,   0,   0, 255]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我当前的一个恼人的问题CMakeLists.txt是它不能在本机中成功编译,只有 wasm 。如果您有比这更好的 cmake 配置,可以轻松更改目标(x86 或 emscripten),请分享您的答案。

\n