OpenCV - работает только с g ++. Не gcc или nvcc - PullRequest
0 голосов
/ 26 сентября 2011

Я установил OpenCV.Я был в состоянии скомпилировать некоторый код, но иногда он не работает.Пример ниже не работает.

#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/gpu/gpu.hpp"

int main (int argc, char* argv[])
{
    try
    {
        cv::Mat src_host = cv::imread("building.jpg", CV_LOAD_IMAGE_GRAYSCALE);
        cv::gpu::GpuMat dst, src;
        src.upload(src_host);

        cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);

        cv::Mat result_host = dst;
        cv::imshow("Result", result_host);
        cv::waitKey();
    }
    catch(const cv::Exception& ex)
    {
        std::cout << "Error: " << ex.what() << std::endl;
    }
    return 0;
}

Я получаю следующие ошибки при компиляции с

gcc Test.cpp $ (pkg-config --cflags --libs opencv)

gcc Test.cpp $(pkg-config --cflags --libs opencv)
Undefined symbols for architecture x86_64:
"std::allocator<char>::allocator()", referenced from:
  _main in ccnzUIww.o
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
  _main in ccnzUIww.o
"std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
  _main in ccnzUIww.o
"std::terminate()", referenced from:
  _main in ccnzUIww.o
"std::allocator<char>::~allocator()", referenced from:
  _main in ccnzUIww.o
"cv::gpu::GpuMat::upload(cv::Mat const&)", referenced from:
  _main in ccnzUIww.o
"cv::gpu::Stream::Null()", referenced from:
  _main in ccnzUIww.o
"cv::gpu::threshold(cv::gpu::GpuMat const&, cv::gpu::GpuMat&, double, double, int, cv::gpu::Stream&)", referenced from:
  _main in ccnzUIww.o
"cv::gpu::GpuMat::operator cv::Mat() const", referenced from:
  _main in ccnzUIww.o
"___cxa_begin_catch", referenced from:
  _main in ccnzUIww.o
"std::cout", referenced from:
  _main in ccnzUIww.o
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
  _main in ccnzUIww.o
"std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
  _main in ccnzUIww.o
"std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from:
  _main in ccnzUIww.o
"___cxa_end_catch", referenced from:
  _main in ccnzUIww.o
"std::ios_base::Init::Init()", referenced from:
  __static_initialization_and_destruction_0(int, int)in ccnzUIww.o
"std::ios_base::Init::~Init()", referenced from:
  ___tcf_0 in ccnzUIww.o
"cv::gpu::GpuMat::release()", referenced from:
  cv::gpu::GpuMat::~GpuMat()in ccnzUIww.o
"___gxx_personality_v0", referenced from:
  Dwarf Exception Unwind Info (__eh_frame) in ccnzUIww.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Я также пробовал:

  • gcc Test.cpp $ (pkg-config --cflags --libs opencv) -m32
  • gcc Test.cpp$ (pkg-config --cflags --libs opencv) -m64
  • nvcc Test.cpp $ (pkg-config --cflags --libs opencv)

Но это такжедать ошибки.Я искал ответы на stackoverflow и нашел это. Компиляция программы OpenCV CUDA В этом ответе решение заключается в использовании этой команды:

g++ Test.cpp `pkg-config --cflags --libs opencv` -lopencv_gpu

И это работает!Я попытался дать один и тот же аргумент компилятору gcc и nvcc, но затем я снова получаю ошибки.Это проблема, поскольку мне приходится использовать компилятор nvcc, потому что я хочу использовать OpenCV в проекте CUDA.

У меня мало опыта работы с C и C ++, поэтому есть вероятность, что это что-то очевидное:)

Ответы [ 2 ]

6 голосов
/ 26 сентября 2011

Для компиляции и связывания C кода вы должны использовать gcc

Для компиляции и компоновки C++ кода вы должны использовать g++

Хотя gcc часто может правильно угадать, на каком языке компилировать файл, он обычно не может ссылаться на нужные библиотеки.

0 голосов
/ 08 февраля 2014

Я думаю, что эти команды будут работать, потому что они работали на моем компьютере (Ubuntu + OpenCV + Eclipse)

huynhngoctan @ ubuntu: ~ / workspace $ g ++ SiftDescriptor.cpp $ (pkg-config --cflags --libs opencv) -lopencv_gpu

huynhngoctan @ ubuntu: ~ / workspace $ ./a.out box.png box_in_scene.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...