Неопределенный символ с использованием emcmake (emscripten и opencv) - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь создать минималистичный проект с использованием OpenCV в браузере.

Я скомпилировал OpenCV на своем компьютере.

Вот код C ++ (josef. cpp ):

#include <iostrem>

#include <opencv2/imgcodecs.hpp>
#include <opencv2/opencv.hpp>   

int main(int argc, char **argv) 
{ 
    printf("Hello here\n"); 
    cv::Mat m;
    std::cout << m;
}

Вот это CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project( josef )

# Give here the directory in which we have
# the file OpenCVConfig.cmake
set(OpenCV_DIR "/usr/local/lib/cmake/opencv4")
find_package( OpenCV REQUIRED )
add_executable( josef josef.cpp )
target_link_libraries( josef ${OpenCV_LIBS} )

Компиляция с

cmake .
make

прекрасно работает и обеспечивает исполняемый файл, который дает ожидаемый результат :

Hello here
[]

Моя проблема возникает при попытке использования emscripten.

emcmake cmake .

выдает много предупреждений, подобных этому:

CMake Warning (dev) at /usr/local/lib/cmake/opencv4/OpenCVModules.cmake:393 (add_library):
  ADD_LIBRARY called with SHARED option but the target platform does not
  support dynamic linking.  Building a STATIC library instead.  This may lead
  to problems.
Call Stack (most recent call first):
  /usr/local/lib/cmake/opencv4/OpenCVConfig.cmake:126 (include)
  CMakeLists.txt:7 (find_package)
This warning is for project developers.  Use -Wno-dev to suppress it.

Тогда

emmake make

не работает с неопределенными символами:

error: undefined symbol: _ZN2cv3Mat10deallocateEv
warning: Link with `-s LLD_REPORT_UNDEFINED` to get more information on undefined symbols
warning: To disable errors for undefined symbols use `-s ERROR_ON_UNDEFINED_SYMBOLS=0`

Мой вопрос: что я не так делаю? Как сказать emscripten, где находятся известные пропущенные символы (это файл .so, если я правильно понял)?

1 Ответ

0 голосов
/ 29 апреля 2020

Это частично решение для взлома.

  • В файле /usr/local/lib/cmake/opencv4/OpenCVModules.cmake измените каждый экземпляр "SHARED" на "STATI C".
  • В вашем * Файл 1007 *, добавьте строку
file( GLOB opencv_js "/path/to/opencvjs/opencv/build_js/lib/*.a")

В этой части предполагается, что вы скомпилировали opencv вручную.

  • , затем обратитесь к моему ответу на мой следующий вопрос . (короче говоря: используйте холст, не используйте cv::imdecode.)
...