简体   繁体   English

由于未定义的引用,无法编译 OpenCV?

[英]Cannot get OpenCV to compile because of undefined references?

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/ .我正在运行 Arch Linux 并将 OpenCV 库存储在/usr/include/ I have also checked to ensure that /usr/include is in my PATH.我还检查以确保/usr/include在我的 PATH 中。

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>

using namespace cv; 

int main(int argc, char** argv){
    Mat image;
    Mat grayImage; 

    if(!argv[1]){
        std::cerr << "No image data!" << std::endl;
        return -1; 
    }

    image = imread(argv[1], 1);
    cvtColor(image, grayImage, CV_BGR2GRAY);
    imwrite("Gray_Image.jpg", grayImage);

    namedWindow(argv[1], CV_WINDOW_AUTOSIZE);
    namedWindow("Gray Image", CV_WINDOW_AUTOSIZE);

    imshow(argv[1], image);
    imshow("Gray Image", grayImage);

    waitKey(0);
    return 0;
}

The compiler process successfully finds and include these header files, but I still get undefined reference errors at compile-time.编译器进程成功找到并包含这些头文件,但在编译时我仍然得到未定义的引用错误。 If you look into the header files I included they further include other files in /usr/include/opencv2 .如果您查看我包含的头文件,它们会进一步包含/usr/include/opencv2中的其他文件。 I have checked and such header files do exist.我已经检查过并且确实存在这样的头文件。

Any ideas?有任何想法吗?

/tmp/ccudBcqD.o: In function `main':
test.cpp:(.text+0xc0): undefined reference to `cv::imread(std::string const&, int)'
test.cpp:(.text+0x11f): undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
test.cpp:(.text+0x138): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
test.cpp:(.text+0x158): undefined reference to `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)'
test.cpp:(.text+0x180): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
test.cpp:(.text+0x1ca): undefined reference to `cv::imwrite(std::string const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'
test.cpp:(.text+0x241): undefined reference to `cv::namedWindow(std::string const&, int)'
test.cpp:(.text+0x291): undefined reference to `cv::namedWindow(std::string const&, int)'
test.cpp:(.text+0x2bf): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
test.cpp:(.text+0x2ff): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'
test.cpp:(.text+0x32d): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
test.cpp:(.text+0x361): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'
test.cpp:(.text+0x383): undefined reference to `cv::waitKey(int)'
/tmp/ccudBcqD.o: In function `cv::Mat::~Mat()':
test.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): undefined reference to `cv::fastFree(void*)'
/tmp/ccudBcqD.o: In function `cv::Mat::operator=(cv::Mat const&)':
test.cpp:(.text._ZN2cv3MataSERKS0_[_ZN2cv3MataSERKS0_]+0x111): undefined reference to `cv::Mat::copySize(cv::Mat const&)'
/tmp/ccudBcqD.o: In function `cv::Mat::release()':
test.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): undefined reference to `cv::Mat::deallocate()'
collect2: error: ld returned 1 exit status
[Finished in 1.1s with exit code 1]
[shell_cmd: g++ "/home/branden/Desktop/OpenCV/test.cpp" -o "/home/branden/Desktop/OpenCV/test"]
[dir: /home/branden/Desktop/OpenCV]
[path: /usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl]

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.但是,如果您最近从源代码编译 OpenCV,您将在运行时遇到链接问题,将找不到该库。 In most cases, after compiling libraries from source, you need to do finally:在大多数情况下,从源代码编译库后,您需要最后做:

sudo ldconfig

I have tried all solutions.我已经尝试了所有解决方案。 The -lopencv_core -lopencv_imgproc -lopencv_highgui in comments solved my problem.评论中的-lopencv_core -lopencv_imgproc -lopencv_highgui解决了我的问题。 And now my command line looks like this in geany:现在我的命令行在 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"

follow this tutorial .按照本教程 i ran the install-opencv.sh file in bash.我在 bash 中运行了install-opencv.sh文件。 its in the tutorial它在教程中

read the example from openCV从 openCV 读取示例

CMakeLists.txt 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在 linux mint 17 中测试

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.一种解决方案是使用 MinGW 重建源 OpenCV 库,而不使用 OpenCV 提供的二进制文件。 I did it and it worked like a charm.我做到了,它就像一个魅力。

I had the same error after compiling the opencv4 in linux.在linux中编译opencv4后我遇到了同样的错误。

I had to link the libraries after my .cpp files not before.我必须在我的.cpp文件之后链接库,而不是之前。

g++ $(pkg-config opencv4 --cflags) -std=c++17 foo.cpp $(pkg-config opencv4 --libs) -o foo.o

Note: I also passed -D OPENCV_GENERATE_PKGCONFIG=ON to the cmake command to generate the pkgconfig/opencv4.pc file - the pkg-config command needs it.注意:我还将-D OPENCV_GENERATE_PKGCONFIG=ON传递给cmake命令以生成pkgconfig/opencv4.pc文件 - pkg-config 命令需要它。

Read here for more info about why the order matters: Why does the order in which libraries are linked sometimes cause errors in GCC?阅读此处了解有关顺序为何重要的更多信息: 为什么链接库的顺序有时会导致 GCC 中的错误?

If you do the following, you will be able to use opencv build from OpenCV_INSTALL_PATH.如果您执行以下操作,您将能够使用来自 OpenCV_INSTALL_PATH 的 opencv 构建。

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)

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.意思是加载顺序,我不得不做-lTransform360 -lopencv_dnn345 -lopencv...就像那样,那个顺序。 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:并且把它们放在一起也有帮助,不要把-lTransform360放在最开始......否则你会得到,出于某种奇怪的原因:

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

... ...

I just changed the position of paramters: g++ -o test2.out test2.cpp pkg-config opencv4 --cflags --libs我只是改变了参数的位置: g++ -o test2.out test2.cpp pkg-config opencv4 --cflags --libs

Before I changed the position I used g++ pkg-config opencv4 --cflags --libs test2.cpp -o test2.out.在我改变位置之前,我使用了 g++ pkg-config opencv4 --cflags --libs test2.cpp -o test2.out。

You can try to run pkg-config opencv --cflags --libs in terminal or run pkg-config opencv4 --cflags --libs to see if you can obtain any information.您可以尝试在终端中运行 pkg-config opencv --cflags --libs 或运行 pkg-config opencv4 --cflags --libs 以查看是否可以获得任何信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM