我的电脑正在运行 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})
现在,当我运行这段小代码时,
#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;
}
我明白了
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);
}
我得到所有这些未定义的参考错误:
CMakeFiles/cv_io.dir/io.cpp.o: 在函数
main': io.cpp:(.text+0x40): undefined reference to
cv::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 function
cv::String::String(char const*)‘: io.cpp:(.text._ZN2cv6StringC2EPKc[_ZN2cv6StringC5EPKc]+0x40): 未定义引用cv::String::allocate(unsigned long)' CMakeFiles/cv_io.dir/io.cpp.o: In function
::~String()’: io.cpp:(.text._ZN2cv6StringD2Ev[_ZN2cv6StringD5Ev]+0x10): undefined reference tocv::String::deallocate()' CMakeFiles/cv_io.dir/io.cpp.o: In function
cv::String::operator=(cv::String const&)’ : io.cpp:(. text.ZN2cv6StringaSERKS0 [ ZN2cv6StringaSERKS0 ]+0x2c): undefined reference to `cv::String::deallocate()’ collect2: error: ld returned 1 exit status 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: 目标“所有”的配方失败 make: *** [all] 错误 2
有谁知道如何解决这个问题?我认为问题在于我仍然没有正确链接 CMakeLists.txt
中的所有库。此外,我 在本文下方发现了一条评论,其中 提到了与我正在经历的类似的事情,但我不理解 包含它所指解决方案的页面。 我对 OpenCV 和 CMake 还很陌生,所以希望你能给我提供尽可能明确的说明。我一直坚持这一点,所以非常感谢任何帮助!非常感谢!
原文由 Tony Tarng 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一个工作
CMakelists.txt
与您描述的配置几乎相同,除了我运行的是令人生畏的旧 Ubuntu 12.04(它不是我自己的计算机)。我相信你的问题来自这一行:
这使您可以访问您的发行版的 OpenCV 2.4。然后您将链接到手动安装的 3.2.x 版本。因此,一旦您使用的函数的接口在两个版本之间发生变化,就会出现问题。我认为您的第一段代码是偶然运行的。
这是我的
CMakeList.txt
:如果您不想将安装 OpenCV 3.2 的硬编码路径提交到您的存储库,您可以通过将
find_package
CMakeList.txt
更改为:然后你只需要在运行cmake之前定义变量
OPENCV_INSTALL_DIR
。我通过从我的.bashrc
导出它来做到这一点