2016-07-22 3 views
1

Я пытался коды образца под opencv3.0.0-альфа, когда я столкнулся со следующей ошибкой:В функции _start, «неопределенная ссылка на главный», OpenCV, панорамы

[email protected]:~/cvit/opencv_projects$ make stitch 

g++ `pkg-config --cflags opencv` -o stitch stitch.cpp `pkg-config --libs opencv` 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start': 
/build/glibc-qbmteM/glibc-2.21/csu/../sysdeps/x86_64/start.S:114: undefined reference to `main' 
collect2: error: ld returned 1 exit status 
makefile:5: recipe for target 'stitch' failed 
make: *** [stitch] Error 1 

Я просто скопировать вставленную файл stitching.cpp из opencv/samples/cpp и переименован и поместил его как stitch.cpp в папку моих проектов, где у меня также есть мой make-файл. Makefile выглядит следующим образом:

CFLAGS = `pkg-config --cflags opencv` 
LIBS = `pkg-config --libs opencv` 

% : %.cpp 
    g++ $(CFLAGS) -o [email protected] $< $(LIBS) 

компилировать .cpp файлы, например temp.cpp просто

make temp 

и она прекрасно работает каждый раз. Но с этим конкретным кодом строчки каждый раз появляется ошибка. Вот пример кода -

#include <iostream> 
#include <fstream> 
#include "opencv2/imgcodecs.hpp" 
#include "opencv2/highgui.hpp" 
#include "opencv2/stitching.hpp" 

using namespace std; 
using namespace cv; 

bool try_use_gpu = false; 
vector<Mat> imgs; 
string result_name = "stitch_result.jpg"; 

void printUsage(); 
int parseCmdArgs(int argc, char** argv); 

int main(int argc, char* argv[]) 
{ 
    int retval = parseCmdArgs(argc, argv); 
    if (retval) return -1; 

    Mat pano; 
    Stitcher stitcher = Stitcher::createDefault(try_use_gpu); 
    Stitcher::Status status = stitcher.stitch(imgs, pano); 

    if (status != Stitcher::OK) 
    { 
     cout << "Can't stitch images, error code = " << int(status) << endl; 
     return -1; 
    } 

    imwrite(result_name, pano); 
    return 0; 
} 


void printUsage() 
{ 
    cout << 
     "Rotation model images stitcher.\n\n" 
     "stitching img1 img2 [...imgN]\n\n" 
     "Flags:\n" 
     " --try_use_gpu (yes|no)\n" 
     "  Try to use GPU. The default value is 'no'. All default values\n" 
     "  are for CPU mode.\n" 
     " --output <result_img>\n" 
     "  The default is 'result.jpg'.\n"; 
} 


int parseCmdArgs(int argc, char** argv) 
{ 
    if (argc == 1) 
    { 
     printUsage(); 
     return -1; 
    } 
    for (int i = 1; i < argc; ++i) 
    { 
     if (string(argv[i]) == "--help" || string(argv[i]) == "/?") 
     { 
      printUsage(); 
      return -1; 
     } 
     else if (string(argv[i]) == "--try_use_gpu") 
     { 
      if (string(argv[i + 1]) == "no") 
       try_use_gpu = false; 
      else if (string(argv[i + 1]) == "yes") 
       try_use_gpu = true; 
      else 
      { 
       cout << "Bad --try_use_gpu flag value\n"; 
       return -1; 
      } 
      i++; 
     } 
     else if (string(argv[i]) == "--output") 
     { 
      result_name = argv[i + 1]; 
      i++; 
     } 
     else 
     { 
      Mat img = imread(argv[i]); 
      if (img.empty()) 
      { 
       cout << "Can't read image '" << argv[i] << "'\n"; 
       return -1; 
      } 
      imgs.push_back(img); 
     } 
    } 
    return 0; 
} 

Редактировать: Я просто попробовал запустить образец кода из самой папки с образцами, и он работает. Makefile работает без ошибок, если я помещаю его в папку opencv/samples/cpp, но не копирую - вставляю его в другое место.

ответ

2

Ошибка означает, что линкер не может найти функцию main. Хотя stitch.cpp определяет main (я полагаю), компоновщик не может его найти. Причина неясна из-за того, как вы создали свой Makefile. Я хотел бы сделать эти изменения:

  • использование CXXFLAGS и/или CPPFLAGS для C++, так как CFLAGS для C.
  • расширить выход PKG-конфигурации в замыкающих, так что вы можете увидеть, что ваш компилятор просят делать.

Ваш Makefile будет выглядеть следующим образом:

CXXFLAGS = $(shell pkg-config --cflags opencv) 
LIBS = $(shell pkg-config --libs opencv) 

% : %.cpp 
    g++ $(CXXFLAGS) -o [email protected] $^ $(LIBS) 

Я хотел бы думать, что с этими изменениями фактического источник проблем станет очевидным.

Смежные вопросы