I have installed OpenCV. I have been able to compile some code but sometimes it does not work. The example below does not work.
#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;
}
I get the following errors when I compile with
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
I have also tried:
- 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)
But this also give errors. I have looked for answers on stackoverflow and found this. Compiling OpenCV CUDA program In this answer the solution is to use this command:
g++ Test.cpp `pkg-config --cflags --libs opencv` -lopencv_gpu
And it works! I have tried giving the same argument to the gcc and nvcc compiler but then I get errors again. This is a problem since I have to use the nvcc compiler because I want to use OpenCV in a CUDA project.
I have little experience with C and C++ so there is a possibility that it is something obvious :)