I wrote this simple program that loads matrices from txt files and calculate distances. When compiling the program in visual studio on windows I get the following errors:
1>main.obj : error LNK2019: unresolved external symbol "void __cdecl cv::fastFree(void *)" (?fastFree@cv@@YAXPAX@Z) referenced in function "public: __thiscall cv::Mat::~Mat(void)" (??1Mat@cv@@QAE@XZ) 1>system.obj : error LNK2001: unresolved external symbol "void __cdecl cv::fastFree(void *)" (?fastFree@cv@@YAXPAX@Z) 1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall cv::Mat::deallocate(void)" (?deallocate@Mat@cv@@QAEXXZ) referenced in function "public: void __thiscall cv::Mat::release(void)" (?release@Mat@cv@@QAEXXZ) 1>system.obj : error LNK2001: unresolved external symbol "public: void __thiscall cv::Mat::deallocate(void)" (?deallocate@Mat@cv@@QAEXXZ) 1>main.obj : error LNK2019: unresolved external symbol "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@YAHPAHH@Z) referenced in function "public: void __thiscall cv::Mat::release(void)" (?release@Mat@cv@@QAEXXZ) 1>system.obj : error LNK2001: unresolved external symbol "int __cdecl cv::_interlockedExchangeAdd(int *,int)" (?_interlockedExchangeAdd@cv@@YAHPAHH@Z) 1>system.obj : error LNK2019: unresolved external symbol "public: __thiscall cv::Exception::Exception(int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" (??0Exception@cv@@QAE@HABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00H@Z) referenced in function "public: int & __thiscall cv::Mat::at<int>(int,int)" (??$at@H@Mat@cv@@QAEAAHHH@Z) 1>system.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall cv::Exception::~Exception(void)" (??1Exception@cv@@UAE@XZ) referenced in function "public: int & __thiscall cv::Mat::at<int>(int,int)" (??$at@H@Mat@cv@@QAEAAHHH@Z) 1>system.obj : error LNK2019: unresolved external symbol "void __cdecl cv::error(class cv::Exception const &)" (?error@cv@@YAXABVException@1@@Z) referenced in function "public: int & __thiscall cv::Mat::at<int>(int,int)" (??$at@H@Mat@cv@@QAEAAHHH@Z) 1>system.obj : error LNK2019: unresolved external symbol "public: void __thiscall cv::Mat::create(int,int const *,int)" (?create@Mat@cv@@QAEXHPBHH@Z) referenced in function "public: void __thiscall cv::Mat::create(int,int,int)" (?create@Mat@cv@@QAEXHHH@Z) 1>C:\Users\Ram\documents\visual studio 2012\Projects\descrip\Debug\descrip.exe : fatal error LNK1120: 7 unresolved externals
I intsalled opencv 2.4.6 on my computer and linked it to visual studio properly.
main.cpp
#include "system.h" using namespace std; int main(int argc, char* argv[]){ if(argc != 3){ cout << "Not enough arguments" << endl; exit(-1); } System s(argv[2]); s.Parse_Centers(argv[1]); s.Run(); return 0; }
system.h
#include <iostream> #include <fstream> #include <dirent.h> #include <time.h> #include "cv.h" #include "highgui.h" #include "opencv2/opencv.hpp" #define NUM_CENTERS 5000 #define NUM_COL 512 using namespace cv; class System{ public: System(char *dir); void Run(); void Parse_Centers(char* path); void Compute_Histogram(const char* filename); private: Mat centers; Mat centers_zero; char *dir_path; };
system.cpp
#include "system.h" using namespace std; using namespace cv; System::System(char *dir){ centers.create(NUM_CENTERS, NUM_COL, CV_8U); centers_zero.create(NUM_CENTERS, NUM_COL, CV_8U); dir_path = dir; }; void System::Parse_Centers(char* path){ ifstream fin; int temp, n, line = 0; fin.open(path); if(!fin.good()){ throw 1; } while(!fin.eof()){ char buf[2048]; const char* token[NUM_COL] = {}; n = 0; fin.getline(buf, 2048); token[0] = strtok(buf, ","); if(token[0]){ temp = atoi(token[0]); if(temp){ centers.at<int>(line,n) = temp; centers_zero.at<int>(line,n) = temp * temp; } for(int n = 1; n < 512; n++){ token[n] = strtok(0, ","); temp = atoi(token[n]); if(temp){ centers.at<int>(line,n) = temp; centers_zero.at<int>(line,n) = temp * temp; } } } line++; } fin.close(); }; void System::Run(){ DIR *dir; struct dirent *entry; time_t start_t; time_t end_t; dir = opendir(dir_path); if(!dir){ cout << "Directory wasn't found" << endl; throw 3; } while((entry = readdir(dir)) != NULL){ if(entry->d_name[0] != '.'){ string path = string(dir_path) + "/" + string(entry->d_name); cout << "entry: " << path; time(&start_t); Compute_Histogram(path.c_str()); time(&end_t); cout << " " << difftime(start_t,end_t) << "sec" << endl; } } closedir(dir); } void System::Compute_Histogram(const char* filename){ int dist[NUM_CENTERS]; int desc[NUM_CENTERS] = {0}; int temp, place = 0; ifstream fin; fin.open(filename); if(!fin.good()){ throw 2; } while(!fin.eof()){ char buf[2048]; const char* token[512] = {}; fin.getline(buf, 2048); token[0] = strtok(buf, ","); if(token[0]){ temp = atoi(token[0]); if(temp){ for(int i = 0; i < NUM_CENTERS; i++){ dist[i] = (temp - centers.at<int>(i,0)) * (temp - centers.at<int>(i,0)); } } else{ for(int i = 0; i < NUM_CENTERS; i++){ dist[i] = centers_zero.at<int>(i,0); } } for(int n = 1; n < NUM_COL; n++){ token[n] = strtok(0, ","); temp = atoi(token[n]); if(temp){ for(int i = 0; i < NUM_CENTERS; i++){ dist[i] += (temp - centers.at<int>(i,n)) * (temp - centers.at<int>(i,n)); if((n == 511) && (i > 0)){ if(dist[i] < dist[place]){ place = i; } } } } else{ for(int i = 0; i < NUM_CENTERS; i++){ dist[i] += centers_zero.at<int>(i,n); if((n == 511) && (i > 0)){ if(dist[i] < dist[place]){ place = i; } } } } } } desc[place]++; } fin.close(); ofstream outfile; string path; path = string(filename) + ".csv"; outfile.open(path.c_str()); for(int i = 0; i < 4999; i++){ outfile << desc[i] << ","; } outfile << desc[4999]; outfile.close(); };
What am i doing wrong????
So when we try to assign it a value in the main function, the linker doesn't find the symbol and may result in an “unresolved external symbol” or “undefined reference”. The way to fix this error is to explicitly scope the variable using '::' outside the main before using it.
To fix this issue, add the /NOENTRY option to the link command. This error can occur if you use incorrect /SUBSYSTEM or /ENTRY settings in your project. For example, if you write a console application and specify /SUBSYSTEM:WINDOWS, an unresolved external error is generated for WinMain .
Answer. Unresolved external references occur when the symbol for a function or global variable is referenced in a program, but none of the object files or libraries specified in the link step contain a definition for that symbol.
Like others mentioned, you need to make sure you're linking to the OpenCV libs correctly.
Check that your Project -> Properties -> VC++ Directories -> Library Directories, includes the path where the OpenCV libraries are, the default would be 'C:\opencv\build\x86\vc11\lib' (on a 32-bit machine running VS2012, it will vary on other setups).
Next, check that the following libraries are included in your Project -> Properties -> Linker -> Input -> Additional Dependencies :
opencv_core246d.lib
opencv_imgproc246d.lib
opencv_highgui246d.lib
opencv_ml246d.lib
opencv_video246d.lib
opencv_features2d246d.lib
opencv_calib3d246d.lib
opencv_objdetect246d.lib
opencv_contrib246d.lib
opencv_legacy246d.lib
opencv_flann246d.lib
If the above are correct, you shouldn't get any more OpenCV link errors.
Perhaps you are building for win32 but linking to x64. If you set your application to x64 then it will build, whereas in win32 it gives linking errors. Right click on the solution and go to configuration, platform column. I found it tricky to set this, I wonder if it's buggy or not.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With