簡體   English   中英

在Linux / Ubuntu中編譯openCV應用程序時,如何解決未定義的參考cv:…?

[英]How to solve undefined reference cv:… when compiling openCV application in Linux/Ubuntu?

按照以下步驟,我設法在OSX環境中的本地文件夾中構建OpenCV(版本4.0.0)。

我在Linux和Ubuntu上嘗試了相同的步驟,並做了

export LD_LIBRARY_PATH=../your/path/lib/:$LD_LIBRARY_PATH

一切看起來都很好,但是當我嘗試使用在問題中發布的Makefile編譯測試項目時,我得到了這個錯誤

/tmp/ccVvPXNi.o: In function `cv::String::~String()':
test.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()'
/tmp/ccVvPXNi.o: In function `cv::String::operator=(cv::String const&)':
test.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): undefined reference to `cv::String::deallocate()'
collect2: error: ld returned 1 exit status
Makefile:23: recipe for target 'test.o' failed
make: *** [test.o] Error 1

並通過以下Makefile獲得更多未定義的引用:

CPP = g++

# OpenCV trunk
CPPFLAGS = -std=c++11  \
           `pkg-config --cflags --libs ../cmake_bin_dir/instDir/lib/pkgconfig/opencv.pc`

# Opencv 2.4.8
#CPPFLAGS = -L/home/krystof/libs/opencv-2.4.8/release/installed/libs \
       -I/home/krystof/libs/opencv-2.4.8/release/installed/include

all: provaMat

provaMat.o: provaMat.cpp
    $(CPP) $(CPPFLAGS) $^ -o $@

在這種情況下,我得到以下錯誤:

/tmp/ccwJs00N.o: In function `main':
provaMat.cpp:(.text+0x38): undefined reference to `cv::VideoCapture::VideoCapture(int)'
provaMat.cpp:(.text+0x47): undefined reference to `cv::VideoCapture::isOpened() const'
provaMat.cpp:(.text+0x91): undefined reference to `cv::namedWindow(cv::String const&, int)'
provaMat.cpp:(.text+0xb3): undefined reference to `cv::VideoCapture::operator>>(cv::Mat&)'
provaMat.cpp:(.text+0x118): undefined reference to `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)'
provaMat.cpp:(.text+0x1c5): undefined reference to `cv::GaussianBlur(cv::_InputArray const&, cv::_OutputArray const&, cv::Size_<int>, double, double, int)'
provaMat.cpp:(.text+0x245): undefined reference to `cv::Canny(cv::_InputArray const&, cv::_OutputArray const&, double, double, int, bool)'
provaMat.cpp:(.text+0x2ab): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
provaMat.cpp:(.text+0x2d3): undefined reference to `cv::waitKey(int)'
provaMat.cpp:(.text+0x322): undefined reference to `cv::VideoCapture::~VideoCapture()'
provaMat.cpp:(.text+0x41b): undefined reference to `cv::VideoCapture::~VideoCapture()'
/tmp/ccwJs00N.o: In function `cv::String::String(char const*)':
provaMat.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x54): undefined reference to `cv::String::allocate(unsigned long)'
/tmp/ccwJs00N.o: In function `cv::String::~String()':
provaMat.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()'
/tmp/ccwJs00N.o: In function `cv::String::operator=(cv::String const&)':
provaMat.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): undefined reference to `cv::String::deallocate()'
/tmp/ccwJs00N.o: In function `cv::Mat::~Mat()':
provaMat.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x39): undefined reference to `cv::fastFree(void*)'
/tmp/ccwJs00N.o: In function `cv::Mat::release()':
provaMat.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x4b): undefined reference to `cv::Mat::deallocate()'
collect2: error: ld returned 1 exit status
Makefile:14: recipe for target 'provaMat.o' failed
make: *** [provaMat.o] Error 1

我想走哪一步? 有人有建議嗎?

編輯: pkg-config --cflags --libs ../cmake_bin_dir/instDir/lib/pkgconfig/opencv.pc

-I/root/openCV4/cmake_bin_dir/instDir/include/opencv -I/root/openCV4/cmake_bin_dir/instDir/include -L/root/openCV4/cmake_bin_dir/instDir/lib -lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core

嘗試將provaMat.o的配方更改為以下內容:

provaMat.o: provaMat.cpp
    $(CPP) $^ $(CPPFLAGS) -o $@

一段時間以來,GCC使用的默認鏈接器選項包括--as-needed標志。 這使鏈接器丟棄在命令行中從未引用過的任何對象。 因此,如果庫出現在對其符號的任何引用之前,則將其完全丟棄。

將規則更改為以下內容,並將所有與庫相關的標志放在LIBS變量中,可能是有道理的。

provaMat.o: provaMat.cpp
    $(CPP) $(CPPFLAGS) $^ $(LIBS) -o $@

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM