如何使用Makefile使用标头正确编译C ++?

时间:2019-02-04 05:44:18

标签: c++ makefile header

我正在尝试使用头文件在macOS终端上构建程序。我已经在cpp文件中包含了标头。但是我遇到了错误:

错误:

Undefined symbols for architecture x86_64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是我尝试运行的文件

#include <iostream>
#include <opencv2/opencv.hpp>
#include "plot.h" //Header File 

using namespace cv;
using namespace std;

int PlotGraph(Mat & data) {

    //converting the Mat to CV_64F
    data.convertTo(data, CV_64F);
    Mat plot_result;

    Ptr<plot::Plot2d> plot = plot::Plot2d::create(data);
    plot->setPlotBackgroundColor(Scalar(50, 50, 50));
    plot->setPlotLineColor(Scalar(50, 50, 255));
    plot->render(plot_result);

    imshow("Graph", plot_result);
    waitKey();

    return 0;
}

我尝试使用-c更改编译器,但仍然遇到相同的错误。这是我的makefile文件

Makefile:

BIN_DIR= .
CC = g++
CFLAGS = -std=c++11 $(shell pkg-config --cflags opencv)
LIBS = $(shell pkg-config --libs opencv)

all: $(BIN_DIR)/trial1

$(BIN_DIR)/trial1: trial1.o
    ${CC} -o $(BIN_DIR)/trial1 trial1.o $(LIBS)

trial1.o: trial1.cpp
    ${CC} $(CFLAGS) -c trial1.cpp

clean:
    rm -f *.o
    rm -f $(BIN_DIR)/trial1

allclean:
    rm -f *.o
    rm -f $(BIN_DIR)/trial1
    rm -f Makefile

我尝试使用其他简单程序(例如“ Hello World”)进行编译,但编译正确。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

假设您在问题中输入的代码是trail1.cpp的全部,并且从链接器错误判断,似乎您缺少了一件非常简单的事情……

int main() {
    return 0;
}

每个c / c ++程序都需要此函数,并且必须将其命名为main(即,您不能将其更改为PlotGraph,可以创建单独的函数PlotGraph是从main()调用的,但不能替代)。您也有两个main选项。作为上述替代方案,您可以执行以下操作:

int main(int argc, const char** argv) {
    return 0;
}

(定义const的方式有一定的自由度,具体取决于您想使用的便捷程度与精确度...即您也可以使用char const * const * const argv,但这是另一回事了)

最后的提示是,您应该对Makefile进行备份,因为运行make allclean后,makefile将消失,由于以下原因,您将无法再次运行make最后一行是rm -f Makefile