C++11 在功能“U启动”和“x27”;对main';的未定义引用,opencv,全景缝合

C++11 在功能“U启动”和“x27”;对main';的未定义引用,opencv,全景缝合,c++11,makefile,opencv3.0,opencv-stitching,C++11,Makefile,Opencv3.0,Opencv Stitching,我在opencv3.0.0-alpha下尝试示例代码时遇到以下错误: ps@hp-pavilion:~/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 `_st

我在opencv3.0.0-alpha下尝试示例代码时遇到以下错误:

ps@hp-pavilion:~/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
我只是简单地从opencv/samples/cpp复制粘贴了stitching.cpp文件,并将其重命名并作为stitch.cpp放置在我的项目文件夹中,在那里我还有我的makefile。生成文件如下所示:

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

% : %.cpp
    g++ $(CFLAGS) -o $@ $< $(LIBS)
而且每次都很完美。但对于这种特殊的缝合代码,每次都会弹出错误。以下是示例代码-

#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;
}
#包括
#包括
#包括“opencv2/imgcodecs.hpp”
#包括“opencv2/highgui.hpp”
#包括“opencv2/stitching.hpp”
使用名称空间std;
使用名称空间cv;
bool try\u use\u gpu=false;
向量imgs;
string result\u name=“stitch\u result.jpg”;
无效打印用法();
int-parseCmdArgs(int-argc,字符**argv);
int main(int argc,char*argv[])
{
int-retval=parseCmdArgs(argc,argv);
if(retval)返回-1;
马特帕诺;
Stitcher-Stitcher=Stitcher::createDefault(尝试使用gpu);
缝合器::状态状态=缝合器缝合(imgs,pano);
如果(状态!=缝合器::确定)
{

cout该错误意味着链接器找不到您的
main
函数。即使
stitch.cpp
定义了
main
(我假设),链接器也找不到它。原因不清楚,因为您构建Makefile的方式。我将进行以下更改:

    使用CXFLAG和/或CPPFLAGS用于C++,因为CFLAGS是C.
  • 在make中展开pkg config输出,以便查看编译器被要求执行的操作
然后,您的Makefile将如下所示:

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

 % : %.cpp
    g++ $(CXXFLAGS) -o $@ $^ $(LIBS)
我认为,随着这些变化,问题的实际根源将变得显而易见

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

 % : %.cpp
    g++ $(CXXFLAGS) -o $@ $^ $(LIBS)