Неопределенная ссылка на `cv::xfeatures2d::SURF::create(double, int, int, bool, bool)'во время выполнения

Я создаю приложение на nvidia jetson nano (под Ubuntu 18.04 LTS), используя Qt-creator. Для этого я создаю свою собственную библиотеку (с именем recolib), которая использует opencv (версия 3.4.6), а затем в своем проекте приложения Qt я включаю свою библиотеку.

Библиотека компилируется нормально, но когда я попытался скомпилировать приложение, оно достигает 100%, а затем я получаю следующую ошибку: неопределенная ссылка на `cv::xfeatures2d::SURF::create(double, int, int, bool, bool)',

Обратите внимание, что класс, где вызывается эта функция, является частью моей библиотеки "recolib".

Я собрал opencv с помощью cmake, я включил несвободные модули и дал правильный путь к нему, а opencv собрал и установил нормально.

Кроме того, приложение хорошо работает на Mac и на виртуальной машине с Ubuntu.

Вот примеры Cmakelist.txt приложения:

cmake_minimum_required(VERSION 3.0)

# Add folder where are supportive functions
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -pthread -lm")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11 -pthread -lm")

...

find_package(OpenCV REQUIRED)

if(OPENCV_XFEATURES2D_FOUND)
    message("xfeatures2d found")
endif()

...

SET(RECOLIB_DIR "${PROJECT_SOURCE_DIR}/libs/recotracking-recolib")

include_directories("${RECOLIB_DIR}/include")
if(WIN32)
    link_directories("${RECOLIB_DIR}/build/Debug")
else()
    link_directories("${RECOLIB_DIR}/build/")
endif()

SET(RECOLIB_LIBRARY recolib)

include_directories(${OPENCV_INCLUDE_DIRS})

...

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

FILE(GLOB_RECURSE RES_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.qrc")
FILE(GLOB_RECURSE SRC_FILES "${SRC_FOLDER}/*.cpp")
FILE(GLOB_RECURSE UI_FILES "${SRC_FOLDER}/*.ui")
FILE(GLOB_RECURSE HDR_FILES "${HDR_FOLDER}/*.h")

link_directories(${OpenCV_LIBRARY_DIRS})
message("opencv libs: ${OpenCV_LIBRARIES}")
add_executable(${execName}  ${OS_BUNDLE}# Expands to WIN32 or MACOS_BUNDLE depending on OS
    ${RES_FILES} ${SRC_FILES} ${UI_FILES} ${HDR_FILES} ${META_FILES_TO_INCLUDE}
)

...

# Add the Qt5 Widgets for linking
if (APPLE)
    target_link_libraries(${execName}
        ${OpenCV_LIBRARIES}
        ${AppKit}
        ${CoreAudio}
        ${AudioToolbox}
        Qt5::Core
        Qt5::Gui
        Qt5::QuickControls2
        Qt5::MultimediaWidgets
        Qt5::Multimedia
        Qt5::MultimediaPrivate
        Qt5::Widgets
        Qt5::Sql
        ${RECOLIB_LIBRARY})
else()
    target_link_libraries(${execName}
        ${OpenCV_LIBRARIES}
        Qt5::Core
        Qt5::Gui
        Qt5::QuickControls2
        Qt5::MultimediaWidgets
        Qt5::Multimedia
        #Qt5::MultimediaPrivate
        Qt5::Widgets
        Qt5::Sql
        ${RECOLIB_LIBRARY})
endif()

И вывод, который я получаю, выполняя его под Qt-creator, следующий:

Running "/usr/bin/cmake -E server --pipe=/tmp/cmake-Bg9h0e/socket --experimental" in /home/bookbeo-novatech/build-recotracking-app-Desktop-Release.
Starting to parse CMake project, using: "-DCMAKE_BUILD_TYPE:STRING=Release", "-DCMAKE_CXX_COMPILER:STRING=/usr/bin/g++", "-DCMAKE_C_COMPILER:STRING=/usr/bin/gcc", "-DCMAKE_PREFIX_PATH:STRING=/usr", "-DQT_QMAKE_EXECUTABLE:STRING=/usr/lib/qt5/bin/qmake".
-std=c++11 -pthread -lm
The C compiler identification is GNU 7.4.0
The CXX compiler identification is GNU 7.4.0
Check for working C compiler: /usr/bin/gcc
Check for working C compiler: /usr/bin/gcc -- works
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Detecting C compile features
Detecting C compile features - done
Check for working CXX compiler: /usr/bin/g++
Check for working CXX compiler: /usr/bin/g++ -- works
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Detecting CXX compile features
Detecting CXX compile features - done
Looking for pthread.h
Looking for pthread.h - found
Looking for pthread_create
Looking for pthread_create - not found
Looking for pthread_create in pthreads
Looking for pthread_create in pthreads - not found
Looking for pthread_create in pthread
Looking for pthread_create in pthread - found
Found Threads: TRUE 
Found CUDA: /usr/local/cuda (found suitable exact version "10.0") 
Found OpenCV: /usr/local (found version "3.4.6") 
xfeatures2d found
opencv libs: opencv_calib3d;opencv_core;opencv_cudaarithm;opencv_cudabgsegm;opencv_cudacodec;opencv_cudafeatures2d;opencv_cudafilters;opencv_cudaimgproc;opencv_cudalegacy;opencv_cudaobjdetect;opencv_cudaoptflow;opencv_cudastereo;opencv_cudawarping;opencv_cudev;opencv_dnn;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_shape;opencv_stitching;opencv_superres;opencv_video;opencv_videoio;opencv_videostab;opencv_aruco;opencv_bgsegm;opencv_bioinspired;opencv_ccalib;opencv_cvv;opencv_datasets;opencv_dnn_objdetect;opencv_dpm;opencv_face;opencv_fuzzy;opencv_hfs;opencv_img_hash;opencv_line_descriptor;opencv_optflow;opencv_phase_unwrapping;opencv_plot;opencv_reg;opencv_rgbd;opencv_saliency;opencv_stereo;opencv_structured_light;opencv_surface_matching;opencv_text;opencv_tracking;opencv_xfeatures2d;opencv_ximgproc;opencv_xobjdetect;opencv_xphoto
Configuring done
Generating done
CMake Warning:
Manually-specified variables were not used by the project:

QT_QMAKE_EXECUTABLE


CMake Project was parsed successfully.

Итак, как вы можете видеть, за исключением некоторых проблем с pthread (но, похоже, это не связано с основной проблемой), конфигурация cmake выглядит хорошей. Opencv найден и xfeatures2d тоже.

Но когда я создаю приложение, в конце компиляции я получаю:

[ 94%] Building CXX object CMakeFiles/recotracking-app.dir/recotracking-app_autogen/mocs_compilation.cpp.o
[ 97%] Building CXX object CMakeFiles/recotracking-app.dir/recotracking-app_autogen/EWIEGA46WW/qrc_resources.cpp.o
[100%] Linking CXX executable recotracking-app
/home/bookbeo/recotracking-app/libs/recotracking-recolib/build/librecolib.a(PCB.cpp.o): In function `reco::PCB::load(cv::Mat const&, cv::Mat const&, cv::Mat const&, std::vector<reco::RecoPoi, std::allocator<reco::RecoPoi> >)':
CMakeFiles/recotracking-app.dir/build.make:1045: recipe for target 'recotracking-app' failed
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/recotracking-app.dir/all' failed
Makefile:83: recipe for target 'all' failed
/home/bookbeo-novatech/recotracking-app/libs/recotracking-recolib/src/PCB.cpp:47: undefined reference to `cv::xfeatures2d::SURF::create(double, int, int, bool, bool)'
collect2: error: ld returned 1 exit status
make[2]: *** [recotracking-app] Error 1
make[1]: *** [CMakeFiles/recotracking-app.dir/all] Error 2
make: *** [all] Error 2
10:51:49: Le processus "/usr/bin/cmake" s'est terminé avec le code 2.
Erreur lors de la compilation/déploiement du projet recotracking-app (kit : Desktop)
When executing step "CMake Build"
10:51:49: Temps écoulé : 06:59.

Я уже пытался пересобрать opencv, он ничего не изменил, и модуль xfeatures2d, похоже, найден, поэтому я не знаю, откуда эта ошибка.

Если у вас есть идея, я был бы очень признателен.

Заранее спасибо.

0 ответов

Другие вопросы по тегам