Как использовать emscripten с cmake для зависимостей проекта? - PullRequest
4 голосов
/ 26 апреля 2019

Итак, я пытаюсь портировать с 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>

Для начала я попытался скомпилировать минимальный привет-мир 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;
}

У меня есть следующее 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} )

Где third-party/opencv-4.1.0/build_wasm - папка, в которой я собрал OpenCV для wasm (cf doc) с:

python ./platforms/js/build_js.py build_wasm --build_wasm

Теперь, когда я запускаю 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

Содержимое CMakeFiles/CMakeOutput.log:

The target system is: Emscripten - 1 - x86
The host system is: Linux - 4.19.36-1-lts - x86_64

1 Ответ

1 голос
/ 29 апреля 2019

Итак, мне наконец-то удалось скомпилировать пример с помощью cmake. Это довольно уродливо, так как я вручную добавляю include и библиотеки с некоторыми GLOB. Я хотел, чтобы при создании библиотеки для wasm OpenCV предоставил файл OpenCVConfig.cmake со всеми выполненными настройками зависимостей. Это позволит использовать классические ${OpenCV_INCLUDE_DIRS} и ${OpenCV_LIBS} при нацеливании на wasm.

cmake_minimum_required( VERSION 3.1 )
set( CMAKE_CXX_STANDARD 11 )
project( HelloCV )

# Does not work
# find_package( OpenCV REQUIRED PATHS third-party/opencv-4.1.0/build_wasm NO_DEFAULT_PATH)

# Needed for opencv2/opencv.hpp
include_directories( third-party/opencv-4.1.0/include )

# Needed by opencv.hpp for opencv2/opencv_modules.hpp
include_directories( third-party/opencv-4.1.0/build_wasm )

# Needed by opencv_modules.hpp for every module
file( GLOB opencv_include_modules "third-party/opencv-4.1.0/modules/*/include" )
include_directories( ${opencv_include_modules} )

# Our hello world executable
add_executable( hello hello.cpp )

# Link to opencv.js precompiled libraries
file( GLOB opencv_js "third-party/opencv-4.1.0/build_wasm/lib/*.a" )
target_link_libraries( hello ${opencv_js} )

Это хорошо работает при компиляции в WebAssembly с emscripten:

~/t/e/o/build  emconfigure cmake -DCMAKE_BUILD_TYPE=Release ..
...
~/t/e/o/build  emmake make
...
~/t/e/o/build  node hello.js
M =
 [  0,   0, 255,   0,   0, 255;
   0,   0, 255,   0,   0, 255]

Досадная проблема с моим текущим CMakeLists.txt в том, что он не компилируется успешно в native, только wasm. Если у вас конфигурация cmake лучше, чем эта, это позволит легко сменить цель (x86 или emscripten), пожалуйста, поделитесь своим ответом.

...