Неопределенная ссылка при компиляции проекта C ++ с pocketsphinx и opencv - PullRequest
0 голосов
/ 21 июня 2020

Недавно я установил pocketsphinx и opencv, я создал и скомпилировал образцы проектов с обеими этими библиотеками, и обе работали нормально. Затем я попытался создать проект, в котором я бы использовал оба, но компиляция стала проблемой.

Я не думаю, что это имеет какое-либо отношение к моей текущей проблеме, но сначала было некое противоречивое объявление типа. Я решил это, изменив файл sphinx prim_type.h следующим образом:

#if !defined(int64) && !defined(int64)
// If other dependencies use those, prevents conflicting declaration
#elif defined(_MSC_VER)
typedef __int64          int64;
typedef unsigned __int64 uint64;
#elif defined(HAVE_LONG_LONG) && (SIZEOF_LONG_LONG == 8)
typedef long long int      int64;
typedef unsigned long long uint64;
#else /* !HAVE_LONG_LONG && SIZEOF_LONG_LONG == 8 */
typedef double          int64;
typedef double          uint64;
#endif /* !HAVE_LONG_LONG && SIZEOF_LONG_LONG == 8 */

Первый, если его не было, я добавил его так, чтобы не было проблем, если я сначала импортировал opencv и ЗАТЕМ sphinx в файле, требующем обеих зависимостей.

Затем я попытался скомпилировать следующий код (это чистый код opencv, который я использовал для тестирования opencv)

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"


#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>

#include <iostream>
#include <stdio.h>

#include "body_parts_detection/detectBodyParts.h"


using namespace std;

int main( int argc, const char** argv )
{
    VideoCapture capture(0); // capture video from webcam
    Mat frame, prevFrame;
    
    while( true )
    {
        // Capture the current frame from the input video stream
        capture >> frame;
        
        // Downsample the input frame for faster processing
        float downsampleFactor = 0.5;
        resize(frame, frame, Size(), downsampleFactor, downsampleFactor, INTER_NEAREST);
        
        // Apply the classifier to the frame depending on the enabled macros
        if( !frame.empty() )
        {
            detectEyes(frame);
        }
        
        else
        {
            cout << "No captured frame. Stopping!" << endl;
            break;
        }
        
        int c = waitKey(10);
        if( (char)c == 27 ) { break; }
    }
    
    capture.release();
    
    return 0;
}

Btw body_parts_detection/detectBodyParts.h - это заголовочный файл следующего проекта, который я импортировал: https://github.com/prateekvjoshi/Body-Parts-Detection, обратите внимание, что основная функция также исходит из этого проекта.

Теперь, когда я пытаюсь скомпилировать это, компилятор получает только opencv библиотеки, то есть с помощью следующей команды:

g ++ main. cpp ./body_parts_detection/*.cpp -o main `pkg-config --cflags --libs opencv`

где pkg-config --cflags --libs opencv дает мне:

-I / usr / include / opencv -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bgsegm -lopencv_bgsegm -lopen lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf - lopencv_line_descriptor -lopencv_optflow -lopencv_video -lopencv_plot -lopencv_reg - lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping - lopencv_rgbd -lopencv_viz -lopencv_surface_matching -lopencv_text -lopencv_ximgpro c - lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect -lopencv_objdetect - lopencv_ml -lopencv_xphoto -lopencv_high gui -lopencv_videoio -lopencv_imgcodecs - lopencv_photo -lopencv_imgpro c -lopencv_core`

Он, как я уже сказал, отлично работает! Но когда я пытаюсь добавить в смесь библиотеки pocketsphinx, с помощью следующей команды:

g ++ main. cpp ./body_parts_detection/*.cpp -o main `pkg-config - cflags --libs opencv pocketsphinx`

где pkg-config --cflags --libs opencv pocketsphinx дает мне

-I / usr / local / include -I / usr / local / include / sphinxbase -I / usr / local / include / pocketsphinx -I / usr / local / include -I / usr / local / include / sphinxbase -I / usr / include / opencv -L / usr / local / lib -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostaru -lopencvideostaru -lopencvideostaru -lopencvideostaru -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_datasets -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_line_descriptor -lopencv_optflow -lopencv_video -lopencv_plot -lopencv_reg -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_viz -lopencv_surface_matching -lopencv_text -lopencv_ximgpro c - lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdete ct -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_high gui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgpro c -lopencv_photo -lopencv_imgpro *1058* -lopencv_core -lpocketsphinx-10pulphinx-просто , он больше не работает, и я получаю undefined reference ошибок (имейте в виду, что это чистый проект opencv, нет зависимостей pocketsphinx):

/tmp/ccVDpw8s.o: In function `main':
main.cpp:(.text+0x38): undefined reference to `cv::VideoCapture::VideoCapture(int)'
/tmp/ccbZxpo9.o: In function `detectFace(cv::Mat)':
detectBodyParts.cpp:(.text+0x74): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0x4d3): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/tmp/ccbZxpo9.o: In function `detectEyes(cv::Mat)':
detectBodyParts.cpp:(.text+0x681): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0x6d0): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0xc82): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/tmp/ccbZxpo9.o: In function `detectEars(cv::Mat)':
detectBodyParts.cpp:(.text+0xea9): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0xef8): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0x1637): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/tmp/ccbZxpo9.o: In function `detectMouth(cv::Mat)':
detectBodyParts.cpp:(.text+0x185e): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0x1cbd): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/tmp/ccbZxpo9.o: In function `detectNose(cv::Mat)':
detectBodyParts.cpp:(.text+0x1e5a): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0x22b9): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/tmp/ccbZxpo9.o: In function `detectSmile(cv::Mat)':
detectBodyParts.cpp:(.text+0x2456): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0x28b5): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/tmp/ccbZxpo9.o: In function `detectUpperBody(cv::Mat)':
detectBodyParts.cpp:(.text+0x2a52): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0x2d0c): undefined reference to `cv::rectangle(cv::Mat&, cv::Rect_<int>, cv::Scalar_<double> const&, int, int, int)'
detectBodyParts.cpp:(.text+0x2d61): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/tmp/ccbZxpo9.o: In function `detectLowerBody(cv::Mat)':
detectBodyParts.cpp:(.text+0x2ee1): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0x3340): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/tmp/ccbZxpo9.o: In function `detectFullBody(cv::Mat)':
detectBodyParts.cpp:(.text+0x34dd): undefined reference to `cv::CascadeClassifier::load(cv::String const&)'
detectBodyParts.cpp:(.text+0x393c): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
/tmp/ccbZxpo9.o: In function `cv::String::String(char const*)':
detectBodyParts.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x4d): undefined reference to `cv::String::allocate(unsigned long)'
/tmp/ccbZxpo9.o: In function `cv::String::~String()':
detectBodyParts.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()'
collect2: error: ld returned 1 exit status
The terminal process terminated with exit code: 1

EDIT Это libs, которые, кажется, вызывают проблемы. Я мог бы сохранить результат pkg-config с --cflags ofpocketsphinx, пока флаг --libs идет только с opencv

Кто-нибудь знает, как решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...