2017-01-28 5 views
0

UPDATE: код успешно компилируется на другом компьютере. Поэтому проблема заключается не в самом коде, а в том, как у меня установлены зависимости.OpenCV: неопределенная ссылка на `cv :: namedWindow (cv :: String const &, int) '


Если у меня нет необходимой информации, пожалуйста, дайте мне знать. Полный код можно найти here.

Следующий код компилируется и работает прекрасно на Ubuntu 14.04 с OpenCV 3.2.0 свежеустановленная из SourceForge, используя these instructions:

#include <stdio.h> 
#include <opencv2/opencv.hpp> 

using namespace cv; 

int main(int argc, char** argv) 
{ 
    Mat image; 
    image = imread(argv[1], 1); 
    namedWindow("Display Image", WINDOW_AUTOSIZE); 
    imshow("Display Image", image); 
    waitkey(0); 

    return 0; 
} 

Используя следующие CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 
project(DisplayImage) 
find_package(OpenCV REQUIRED) 
add_executable(DisplayImage DisplayImage.cpp) 
target_link_libraries(DisplayImage ${OpenCV_LIBS}) 

Следующая код не компилируется.

lane_finder.h

#ifndef Lane_Finder_h 
#define Lane_Finder_h 

#include <stdio.h> 
#include <ros/ros.h> 
#include <sensor_msgs/Image.h> 
#include <sensor_msgs/image_encodings.h> 
#include <cv_bridge/cv_bridge.h> 
#include <opencv2/opencv.hpp> 

class LaneFinder 
{ *snip* } 

#endif 

lane_finder.cpp:

#include "lane_finder.h" 

sensor_msgs::CompressedImage LaneFinder::findLanes(const sensor_msgs::Image& msg) { 
    *snip* 
    frame = in_msg->image; 

    cv::namedWindow("Display Image", cv::WINDOW_AUTOSIZE); 
    cv::imshow("Display Image", frame); 
    *snip* 
} 

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3) 
project(lane_finding) 
find_package(catkin REQUIRED COMPONENTS roscpp cv_bridge sensor_msgs) 
find_package(OpenCV REQUIRED) 
catkin_package() 
include_directories(include ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS}) 
add_executable(lane_finder src/lane_finder.cpp src/main.cpp) 
target_link_libraries(lane_finder 
    ${catkin_LIBRARIES} 
    ${OpenCV_LIBS} 
) 

ошибки компиляции:

CMakeFiles/lane_finder.dir/src/lane_finder.cpp.o: In function `LaneFinder::findLanes(sensor_msgs::Image_<std::allocator<void> > const&)': 
lane_finder.cpp:(.text+0x36c): undefined reference to `cv::namedWindow(cv::String const&, int)' 
lane_finder.cpp:(.text+0x3c1): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)' 
CMakeFiles/lane_finder.dir/src/lane_finder.cpp.o: In function `cv::String::String(char const*)': 
lane_finder.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x4f): undefined reference to `cv::String::allocate(unsigned long)' 
CMakeFiles/lane_finder.dir/src/lane_finder.cpp.o: In function `cv::String::~String()': 
lane_finder.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x14): undefined reference to `cv::String::deallocate()' 
CMakeFiles/lane_finder.dir/src/lane_finder.cpp.o: In function `cv::String::operator=(cv::String const&)': 
lane_finder.cpp:(.text._ZN2cv6StringaSERKS0_[_ZN2cv6StringaSERKS0_]+0x28): undefined reference to `cv::String::deallocate()' 
collect2: error: ld returned 1 exit status 

Я не могу на всю жизнь понять, почему один работает отлично, а другой терпит неудачу. Я подозреваю, что я связал что-то неправильно, так как это моя первая попытка скомпилировать, используя файл заголовка, который я написал сам. Если вы считаете, что я пропустил что-то важное, пытаясь сохранить это читабельность, я включил ссылку на репозиторий github, содержащий полный код в начале этого сообщения.

Спасибо вам большое.

+0

Ну, вы получаете ошибки компоновщика, так что, похоже, как-то происходит не так в процессе сборки, но я ничего не знаю о OpenCV, и я не вижу ничего явно неправильного в том, что вы делаете. Посмотрите, можете ли вы очистить свой код и библиотеки, пока не получите что-то, что работает; что может помочь найти, где проблема. –

ответ

-1

cv_bridge зависит от OpenCV 2.4. Изменение CMakeLists.txt указать:

find_package(OpenCV 2 REQUIRED) 
0

Вы должны добавить эту опцию:

pkg-config opencv --cflags --libs

Смежные вопросы