Как правильно скомпилировать C ++ с заголовком, используя Makefile? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь собрать программу на терминале 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, новсе еще сталкиваюсь с той же ошибкой.Вот мой make-файл

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 голосов
/ 04 февраля 2019

Предполагая, что код, который вы задали в своем вопросе, составляет всего trail1.cpp, и, судя по ошибке компоновщика, кажется, что вам не хватает довольно простой вещи ...

int main() {
    return 0;
}

Эта функциятребуется в каждой программе на языке c / c ++, и она должна называться main (т.е. вы не можете изменить ее на PlotGraph, вы можете создать отдельную функцию PlotGraph, которая вызывается из main(), но она не заменяет).У вас также есть два варианта для основного.В качестве альтернативы вышеприведенному вы можете сделать:

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

(есть некоторая свобода в том, как вы определяете const, в зависимости от того, насколько удобно и насколько точно вы хотите быть ... т.е. вы также можете использоватьchar const * const * const argv, но это уже другая история)

В качестве последней подсказки вы, вероятно, должны сделать резервную копию вашего Makefile, как он выглядит после того, как вы запустите make allclean, ваш makefile исчезнет, ​​и вы не сможетеснова запустить make из-за последней строки rm -f Makefile

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...