如何在具有cmake的项目依赖项中使用emscripten?

7

我正在尝试使用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 "hello world"程序:
#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 的文件夹(详见文档),使用了以下命令:

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

现在,当我在我的项目上运行emconfigure cmake ..时,它无法找到OpenCV(“无法找到软件包配置...”)。 我做错了什么,但我不知道是什么。不幸的是,使用cmake和依赖项的emscripten文档并不详细。或者这个问题可能只与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

您能上传完整的错误日志吗? - Bumsik Kim
是的,我已经将错误添加到问题中。 - Matthieu Pizenberg
2个回答

3

我终于成功用cmake编译了这个例子。不过,它看起来很丑,因为我使用了GLOB手动添加了包含文件和库。希望在构建wasm库时,OpenCV能提供一个OpenCVConfig.cmake文件,并设置所有依赖项,这将使得在针对wasm目标时可以使用经典的${OpenCV_INCLUDE_DIRS}${OpenCV_LIBS}

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} )

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

~/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 存在一个烦人的问题,它只能在 wasm 中成功编译而不能在本机编译。如果您有比这更好的 cmake 配置,可以轻松地更改目标(x86 或 emscripten),请分享您的答案。


0
如果您的项目在源文件数量方面不是太大,那么最好使用emscripten而不是cmake。以下是我使用的命令示例:
emcc latuile.cpp binpack.cpp compact_frame.cpp compact_rectangles.cpp fit_together.cpp KMeansRexCore.cpp MPD_Arc.cpp MyRect.cpp optimize_rectangle_positions.cpp permutation.cpp stair_steps.cpp swap_rectangles.cpp WidgetContext.cpp FunctionTimer.cpp -o latuile.js -I/usr/include/eigen3 -Wno-c++11-narrowing -s EXPORTED_FUNCTIONS='["_latuile"]' -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]' -s ALLOW_MEMORY_GROWTH=1

使用cmake时,我遇到了与您相同的错误,因此我采用了这种方法,停止浪费太多时间。
我只是从我的cmake内部复制了cpp文件列表。 请注意EXPORTED_FUNCTIONS ='["_latuile"]' EXPORTED_RUNTIME_METHODS ='["ccall", "cwrap"]' 以及-s ALLOW_MEMORY_GROWTH = 1选项。 我不知道您如何将所有内容馈送到cmake中...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接