由于未定义引用,无法获取要编译的OpenCV
Cannot get OpenCV to compile because of undefined references?
代码很简单,基本上直接来自本教程。我正在运行Arch Linux,并将OpenCV库存储在/usr/include/
中。我还进行了检查,以确保/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;
}
编译器进程成功地找到并包含了这些头文件,但在编译时我仍然会遇到未定义的引用错误。如果您查看我包含的头文件,它们将进一步包含/usr/include/opencv2
中的其他文件。我已经检查过了,这样的头文件确实存在。
有什么想法吗?
/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]
这是一个链接器问题。尝试:
g++ -o test_1 test_1.cpp `pkg-config opencv --cflags --libs`
这应该可以编译源代码。然而,如果您最近从源代码编译了OpenCV,您将在运行时遇到链接问题,库将找不到。在大多数情况下,在从源代码编译库之后,您最终需要执行以下操作:
sudo ldconfig
我已经尝试了所有的解决方案。评论中的-lopencv_core -lopencv_imgproc -lopencv_highgui
解决了我的问题。现在我的命令行在geany中看起来是这样的:
g++ -lopencv_core -lopencv_imgproc -lopencv_highgui -o "%e" "%f"
当我建立:
g++ -lopencv_core -lopencv_imgproc -lopencv_highgui -o "opencv" "opencv.cpp" (in directory: /home/fedora/Desktop/Implementations)
标题为:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
遵循本教程。我在bash中运行了install-opencv.sh文件。它在教程中
从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;
}
在linux mint 17 中测试
如果有人仍然有这个问题。一种解决方案是使用MinGW重建源OpenCV库,而不使用OpenCV提供的二进制文件。我做到了,它就像一种魅力。
在linux中编译opencv4后,我也出现了同样的错误。
我不得不在我的.cpp
文件之后链接库,而不是以前。
g++ $(pkg-config opencv4 --cflags) -std=c++17 foo.cpp $(pkg-config opencv4 --libs) -o foo.o
注意:我还将-D OPENCV_GENERATE_PKGCONFIG=ON
传递给了cmake
命令,以生成pkgconfig/opencv4.pc
文件——pkg config命令需要它。
请阅读此处了解为什么顺序很重要的更多信息:为什么库链接的顺序有时会导致GCC中的错误?
如果您执行以下操作,您将能够从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)
对我来说,这种类型的错误:
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&)'
意思是装载顺序,我必须像那样做-lTransform360 -lopencv_dnn345 -lopencv...
,那个顺序。把它们放在一起也有帮助,不要一开始就把-lTransform360
放在一起。。。或者你会得到,因为一些奇怪的原因:
undefined reference to `VideoFrameTransform_new'
undefined reference to `VideoFrameTransform_generateMapForPlane'
我刚刚更改了参数的位置:g++-o测试2.out测试2.cpp pkg-config opencv4 --cflags --libs
在我改变位置之前,我使用了g++pkg-config opencv4 --cflags --libs
test2.cpp-o test2.out。
您可以尝试在terminal中运行pkg config opencv--cflags--libs,或者运行pkg config opencv4--cflags-libs,看看是否可以获得任何信息。
- 获取 clang++:错误:在编译文件系统库的代码时
- 如何在常量计算表达式中获取编译时错误?
- 如何在使用 LLVM 编译时获取部分源代码的二进制代码
- 无法获取 wig %ignore 以忽略命名空间中的类,从而导致编译错误
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 解析模板和范围后获取编译文件?
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- 在编译时通过 constexpr 或模板函数获取多维 std::array 的大小
- 为什么在编译时无法获取模板函数的参数计数?
- 在编译时使用可变参数模板在 c++ 中使用参数类型检查获取函数的参数数
- 获取编译文件的列表,并由Make Project包含
- 在 STL 中使用映射获取编译错误C++
- C++获取编译代码中使用的代码部分的大小
- 使用ntddscsi.h获取编译错误
- 在以下程序中获取编译链接错误
- 在没有宏的情况下获取编译时间日期和时间
- 从.exe获取编译日期和时间
- 获取编译时静态constexpr数组的最小/最大值
- Qt-如何获取|编译Mysql驱动程序
- 按照第一个hello world示例在VS2010中获取编译错误