簡體   English   中英

如何使用 Makefile 正確編譯帶有頭文件的 C++?

[英]How do I properly compile C++ with header using Makefile?

我正在嘗試使用頭文件在 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

生成文件:

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”,它編譯正確,但不是這個。 有什么建議嗎?

假設您在問題中輸入的代碼是整個trail1.cpp並且從鏈接器錯誤來看,您似乎錯過了一件非常簡單的事情......

int main() {
    return 0;
}

這個函數在每個 c/c++ 程序中都是必需的,它必須被稱為main (即你不能將它更改為PlotGraph ,你可以創建一個單獨的函數PlotGraphmain()調用,但它不能替代)。 您還有兩個主要選項。 作為上述方法的替代方法,您可以執行以下操作:

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

(根據您想要的方便程度和精確程度,您可以自由定義 const 的方式......即您也可以使用char const * const * const argv ,但那是另一回事了)

作為最后的提示,您可能應該備份您的 Makefile,因為它看起來像在您運行make allclean您的 makefile 將消失並且您將無法再次運行make由於最后一行是rm -f Makefile

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM