Cannot get OpenCV to compile because of undefined references?

后端 未结 6 1335
再見小時候
再見小時候 2020-12-02 14:52

The code is simple and is essentially straight from this tutorial. I am running Arch Linux and have the OpenCV library stored at /usr/include/. I have also chec

相关标签:
6条回答
  • 2020-12-02 14:58

    For me, this type of error:

    mingw-w64-x86_64/lib/gcc/x86_64-w64-mingw32/8.2.0/../../../../x86_64-w64-mingw32/bin/ld: mingw-w64-x86_64/x86_64-w64-mingw32/lib/libTransform360.a(VideoFrameTransform.cpp.obj):VideoFrameTransform.cpp:(.text+0xc7c):
    undefined reference to `cv::Mat::Mat(cv::Mat const&, cv::Rect_<int> const&)'
    

    meant load order, I had to do -lTransform360 -lopencv_dnn345 -lopencv... just like that, that order. And putting them right next to each other helped too, don't put -lTransform360 all the way at the beginning...or you'll get, for some freaky reason:

    undefined reference to `VideoFrameTransform_new'
    undefined reference to `VideoFrameTransform_generateMapForPlane'
    

    ...

    0 讨论(0)
  • 2020-12-02 15:04

    I have tried all solution. The -lopencv_core -lopencv_imgproc -lopencv_highgui in comments solved my problem. And know my command line looks like this in geany:

    g++ -lopencv_core -lopencv_imgproc -lopencv_highgui  -o "%e" "%f"
    

    When I build:

    g++ -lopencv_core -lopencv_imgproc -lopencv_highgui  -o "opencv" "opencv.cpp" (in directory: /home/fedora/Desktop/Implementations)
    

    The headers are:

    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    
    0 讨论(0)
  • 2020-12-02 15:10

    if anyone still having this problem. One solution is to rebuild the source OpenCV library using MinGW and not use the binaries given by OpenCV. I did it and it worked like a charm.

    0 讨论(0)
  • 2020-12-02 15:12

    follow this tutorial. i ran the install-opencv.sh file in bash. its in the tutorial

    read the example from openCV

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.7)
    project(openCVTest)
    # cmake needs this line
    cmake_minimum_required(VERSION 2.8)
    
    # Define project name
    project(opencv_example_project)
    
    # Find OpenCV, you may need to set OpenCV_DIR variable
    # to the absolute path to the directory containing OpenCVConfig.cmake file
    # via the command line or GUI
    find_package(OpenCV REQUIRED)
    
    # If the package has been found, several variables will
    # be set, you can find the full list with descriptions
    # in the OpenCVConfig.cmake file.
    # Print some message showing some of them
    message(STATUS "OpenCV library status:")
    message(STATUS "    version: ${OpenCV_VERSION}")
    message(STATUS "    libraries: ${OpenCV_LIBS}")
    message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
    
    if(CMAKE_VERSION VERSION_LESS "2.8.11")
        # Add OpenCV headers location to your include paths
        include_directories(${OpenCV_INCLUDE_DIRS})
    endif()
    
    # Declare the executable target built from your sources
    add_executable(main main.cpp)
    
    # Link your application with OpenCV libraries
    target_link_libraries(main ${OpenCV_LIBS})
    

    main.cpp

    /**
     * @file LinearBlend.cpp
     * @brief Simple linear blender ( dst = alpha*src1 + beta*src2 )
     * @author OpenCV team
     */
    
    #include "opencv2/imgcodecs.hpp"
    #include "opencv2/highgui.hpp"
    #include <stdio.h>
    
    using namespace cv;
    
    /** Global Variables */
    const int alpha_slider_max = 100;
    int alpha_slider;
    double alpha;
    double beta;
    
    /** Matrices to store images */
    Mat src1;
    Mat src2;
    Mat dst;
    
    //![on_trackbar]
    /**
     * @function on_trackbar
     * @brief Callback for trackbar
     */
    static void on_trackbar( int, void* )
    {
        alpha = (double) alpha_slider/alpha_slider_max ;
    
        beta = ( 1.0 - alpha );
    
        addWeighted( src1, alpha, src2, beta, 0.0, dst);
    
        imshow( "Linear Blend", dst );
    }
    //![on_trackbar]
    
    /**
     * @function main
     * @brief Main function
     */
    int main( void )
    {
        //![load]
        /// Read images ( both have to be of the same size and type )
        src1 = imread("../data/LinuxLogo.jpg");
        src2 = imread("../data/WindowsLogo.jpg");
        //![load]
    
        if( src1.empty() ) { printf("Error loading src1 \n"); return -1; }
        if( src2.empty() ) { printf("Error loading src2 \n"); return -1; }
    
        /// Initialize values
        alpha_slider = 0;
    
        //![window]
        namedWindow("Linear Blend", WINDOW_AUTOSIZE); // Create Window
        //![window]
    
        //![create_trackbar]
        char TrackbarName[50];
        sprintf( TrackbarName, "Alpha x %d", alpha_slider_max );
        createTrackbar( TrackbarName, "Linear Blend", &alpha_slider, alpha_slider_max, on_trackbar );
        //![create_trackbar]
    
        /// Show some stuff
        on_trackbar( alpha_slider, 0 );
    
        /// Wait until user press some key
        waitKey(0);
        return 0;
    }
    

    Tested in linux mint 17

    0 讨论(0)
  • 2020-12-02 15:12

    If you do the following, you will be able to use opencv build from OpenCV_INSTALL_PATH.

    cmake_minimum_required(VERSION 2.8)
    
    SET(OpenCV_INSTALL_PATH /home/user/opencv/opencv-2.4.13/release/)
    
    SET(OpenCV_INCLUDE_DIRS "${OpenCV_INSTALL_PATH}/include/opencv;${OpenCV_INSTALL_PATH}/include")
    
    SET(OpenCV_LIB_DIR "${OpenCV_INSTALL_PATH}/lib")
    
    LINK_DIRECTORIES(${OpenCV_LIB_DIR})
    
    set(OpenCV_LIBS opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu)
    
    # find_package( OpenCV )
    
    project(edge.cpp)
    
    add_executable(edge edge.cpp)
    
    0 讨论(0)
  • 2020-12-02 15:18

    This is a linker issue. Try:

    g++ -o test_1 test_1.cpp `pkg-config opencv --cflags --libs`
    

    This should work to compile the source. However, if you recently compiled OpenCV from source, you will meet linking issue in run-time, the library will not be found. In most cases, after compiling libraries from source, you need to do finally:

    sudo ldconfig
    
    0 讨论(0)
提交回复
热议问题