title: What's wrong with my Makefile or C++ Program?
body: <p>I write a Makefile to compile my C++ program, the Makefile code is as follow:</p>
  
  <pre><code>  1 TARGET = main
    2 
    3 CXX = g++
    4 CXXFLAGS = -Wall -g
    5 HEADER = $(wildcard ./*.h)
    6 SRCS = $(wildcard *.cpp)
    7 OBJS = $(patsubst %.cpp, %.o, $(SRCS))
    8 RM = rm -f
    9 
   10 $(TARGET):$(OBJS)
   11     $(CXX) -o $@ $^
   12 
   13 $(OBJS):$(SRCS)
   14     $(CXX) $(CXXFLAGS) $&lt; -o $@
   15 
   16 
   17 .PHONY:clean
   18     clean:
   19     $(RM) $(OBJS) $(TARGET)
  </code></pre>
  
  <p>The file structure of the current directory is as follow:</p>
  
  <pre><code>.
  ├── main.cpp
  ├── Makefile
  ├── MyQueue.cpp
  └── MyQueue.h
  0 directories, 4 files
  </code></pre>
  
  <p>I use <code>g++ main.cpp MyQueue.cpp -o queue</code> to compile the program, the result is right; BUT I use <code>make</code> to compile the program the results are as follows:</p>
  
  <pre><code>g++ -Wall -g  main.cpp -o main.o
  /tmp/ccA6CmCE.o: In function `main':
  /home/tzk/DSA/main.cpp:7: undefined reference to `MyQueue::MyQueue(int)'
  collect2: error: ld returned 1 exit status
  make: *** [main.o] Error 1
  </code></pre>
  
  <p>I have defined the <code>MyQueue(int)</code>!The code of <code>MyQueue.h</code>,<code>MyQueue.cpp</code> and <code>main.cpp</code> are as follows:</p>
  
  <pre><code>MyQueue.h
    1 #ifndef MYQUEUE_H_
    2 #define MYQUEUE_H_
    3 class MyQueue
    4 {
    5     public:
    6         MyQueue(int queueCapacity);
    7         virtual ~MyQueue();
    8         void ClearQueue();
    9         bool QueueEmpty() const;
   10         bool QueueFull() const;
   11         int QueueLength() const;
   12         bool EnQueue(int element);
   13         bool DeQueue(int&amp; element);
   14         void QueueTraverse();
   15 
   16     private:
   17         int *m_pQueue;
   18         int m_iQueueLen;
   19         int m_iQueueCapacity;
   20         int m_iHead;
   21         int m_iTail;
   22 };
   23 
   24 #endif
  
  MyQueue.cpp
    1 #include "MyQueue.h"
    2 #include &lt;iostream&gt;
    3 using namespace std;
    4 
    5 MyQueue::MyQueue(int queueCapacity)
    6 {
    7     m_iQueueCapacity = queueCapacity;
    8     m_iHead = 0;
    9     m_iTail = 0;
   10     m_iQueueLen = 0;
   11     m_pQueue = new int[m_iQueueCapacity];
   12 }
  
  main.cpp
    1 #include &lt;iostream&gt;
    2 #include &lt;cstdlib&gt;
    3 #include "MyQueue.h"
    4 
    5 int main(void)
    6 {
    7     MyQueue *p = new MyQueue(4);
    8 
    9     delete p;
   10     p = NULL;
   11 
   12     return 0;
   13 }
  </code></pre>
  
  <p>So What's wrong with my program or Makefile ?</p>
  
  <p>==========================================================</p>
  
  <p>I try to add <code>-c</code> to the command as follows:</p>
  
  <pre><code> 13 $(OBJS):$(SRCS)
   14     $(CXX) $(CXXFLAGS) -c  $&lt; -o $@
  </code></pre>
  
  <p>But, the result still wrong:</p>
  
  <pre><code>g++ -Wall -g  -c  main.cpp -o main.o
  g++ -Wall -g  -c  main.cpp -o MyQueue.o
  g++ -o main main.o MyQueue.o
  MyQueue.o: In function `main':
  /home/tzk/DSA/main.cpp:6: multiple definition of `main'
  main.o:/home/tzk/DSA/main.cpp:6: first defined here
  main.o: In function `main':
  main.cpp:(.text+0x21): undefined reference to `MyQueue::MyQueue(int)'
  MyQueue.o: In function `main':
  main.cpp:(.text+0x21): undefined reference to `MyQueue::MyQueue(int)'
  collect2: error: ld returned 1 exit status
  make: *** [main] Error 1
  </code></pre>