我的Makefile或C ++程序有什么问题?

时间:2017-04-14 07:06:47

标签: c++ makefile

我编写了一个Makefile来编译我的C ++程序,Makefile代码如下:

  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) $< -o $@
 15 
 16 
 17 .PHONY:clean
 18     clean:
 19     $(RM) $(OBJS) $(TARGET)

当前目录的文件结构如下:

.
├── main.cpp
├── Makefile
├── MyQueue.cpp
└── MyQueue.h
0 directories, 4 files

我使用g++ main.cpp MyQueue.cpp -o queue来编译程序,结果是正确的;但我使用make编译程序,结果如下:

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

我已定义MyQueue(int)MyQueue.hMyQueue.cppmain.cpp的代码如下:

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& 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 <iostream>
  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 <iostream>
  2 #include <cstdlib>
  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 }

那我的程序或Makefile有什么问题?

=============================================== ===========

我尝试将-c添加到命令中,如下所示:

 13 $(OBJS):$(SRCS)
 14     $(CXX) $(CXXFLAGS) -c  $< -o $@

但结果仍然是错误的:

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

2 个答案:

答案 0 :(得分:4)

创建目标文件时,需要-c选项。您没有,这意味着g++尝试创建链接可执行文件main.o

构建目标文件的目标也是错误的。应该是例如。

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

答案 1 :(得分:2)

您必须使用-c标志来转换目标文件中的源文件。

喜欢

$(OBJS):$(SRCS)
    $(CXX) $(CXXFLAGS) -c $< -o $@