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