Ton*_*rng 19 c++ ubuntu opencv cmake
我的电脑正在运行Ubuntu-16.04-LTS,并且已经安装了OpenCV-2.4.13.但是,我想使用较新版本的OpenCV的功能,例如OpenCV-3.2.0而不删除旧版本.
到目前为止,我已经下载了OpenCV-3.2.0并进行了编译和安装.我正在使用CMake来编译OpenCV,所以我将CMakeLists.txt文件更改为:
cmake_minimum_required (VERSION 3.2)
project(io)
find_package(OpenCV REQUIRED)
include_directories("/home/ubuntu/opencv-3.2.0/include") # directory of OpenCV-3.2.0
link_directories("/home/ubuntu/opencv-3.2.0/lib") # directory of OpenCV-3.2.0
add_executable(cv_io io.cpp)
target_link_libraries(cv_io ${OpenCV_LIBS})
Run Code Online (Sandbox Code Playgroud)
现在,当我运行这段小代码时,
#include <iostream>
#include "opencv2/core/version.hpp"
int main(int argc, char ** argv)
{
std::cout << "OpenCV version: "
<< CV_MAJOR_VERSION << "."
<< CV_MINOR_VERSION << "."
<< CV_SUBMINOR_VERSION
<< std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我明白了
OpenCV版本:3.2.0
代替
OpenCV版本2.4.13
所以一切似乎都是有序的,除非我开始运行一些实际的OpenCV函数,例如:
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat img = cv::imread("ferrari.jpg");
cv::Mat dst;
cv::Sobel(img, dst, CV_32F, 1, 1);
cv::imwrite("ferrari_sobel.png", dst);
cv::VideoCapture input(0);
}
Run Code Online (Sandbox Code Playgroud)
我得到所有这些未定义的引用错误:
CMakeFiles/cv_io.dir/io.cpp.o:在函数
main': io.cpp:(.text+0x40): undefined reference tocv :: imread(cv :: String const&,int)'io.cpp :(.text + 0xd4):对cv::imwrite(cv::String const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)' CMakeFiles/cv_io.dir/io.cpp.o: In functioncv :: String :: String的未定义引用 ( char const*)':io.cpp :(.text._ZN2cv6StringC2EPKc [_ZN2cv6StringC5EPKc] + 0x40):未定义引用cv::String::allocate(unsigned long)' CMakeFiles/cv_io.dir/io.cpp.o: In functioncv :: String :: ~String()':io.cpp :(.text._ZN2cv6StringD2Ev [_ZN2cv6StringD5Ev] + 0x10):未定义引用cv::String::deallocate()' CMakeFiles/cv_io.dir/io.cpp.o: In functioncv :: String :: operator =(cv :: String const&)':io.cpp :(.text.ZN2cv6StringaSERKS0 [ ZN2cv6StringaSERKS0 ] + 0x2c):对`cv :: String :: deallocate的未定义引用()'collect2:错误:ld返回1退出状态CMakeFiles/cv_io.dir/build.make:121:目标'cv_io'的配方失败make 2:*[cv_io]错误1 CMakeFiles/Makefile2:67:目标配方' CMakeFiles/cv_io.dir/all'失败make 1:* [CMakeFiles/cv_io.dir/all]错误2 Makefile:83:目标'all'失败的食谱make:***[all]错误2
有谁知道如何解决这个问题?我认为问题是我还没有正确连接所有库CMakeLists.txt.另外,我在本文下面发现了一条评论,提到了类似于我所遇到的内容,但我不理解包含它所指的解决方案的页面.我是OpenCV和CMake的新手,所以希望你能尽可能明确地向我提供说明.我一直坚持这个,所以任何帮助都非常感谢!非常感谢你!
CMakelists.txt除了我正在运行一个令人生畏的旧Ubuntu 12.04(它不是我自己的计算机)之外,我的工作几乎与你描述的配置相同.
我相信你的问题来自这条线:
find_package(OpenCV REQUIRED)
Run Code Online (Sandbox Code Playgroud)
这使您可以访问您的发行版的OpenCV 2.4.然后,您将链接到手动安装的3.2.x版本.因此,只要您使用的函数的接口在两个版本之间发生更改,就会出现问题.我认为你的第一段代码是偶然的.
这是我的CMakeList.txt:
cmake_minimum_required(VERSION 2.8)
project(demo)
find_package(OpenCV 3.2 REQUIRED PATHS "/path/to/OCV3.2/install/dir/")
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBS})
Run Code Online (Sandbox Code Playgroud)
如果您不想向您的存储库提交安装OpenCV 3.2的硬编码路径,可以CMakeList.txt通过将find_package行更改为:
if(DEFINED ENV{OPENCV_INSTALL_DIR})
find_package(OpenCV 3.2 REQUIRED PATHS $ENV{OPENCV_INSTALL_DIR})
else()
message("OPENCV_INSTALL_DIR not set, searching in default location(s)")
find_package(OpenCV 3.2 REQUIRED)
endif(DEFINED ENV{OPENCV_INSTALL_DIR})
Run Code Online (Sandbox Code Playgroud)
然后你必须OPENCV_INSTALL_DIR在运行cmake之前定义变量.我通过从我的导出它来做到这一点.bashrc