2017-04-14 34 views
0

我写一个Makefile来编译我的C++程序,Makefile文件的代码如下:我的Makefile或C++程序出了什么问题?

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 [email protected] $^ 
12 
13 $(OBJS):$(SRCS) 
14  $(CXX) $(CXXFLAGS) $< -o [email protected] 
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 [email protected] 

但是,结果还是错的:

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 
+0

请不要标记C++与C标签的问题。 C是与C++不同的语言。用两者标记可能会导致错误的答案。 – Toby

回答

4

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


你的目标建立目标文件也是错误的。它应该是例如

%.o: %.cpp 
    $(CXX) $(CXXFLAGS) -c $< -o [email protected] 
+0

谢谢您的回复,我尝试添加'-c',但结果仍然错误。像这样'main.cpp :(。text + 0x21):未定义的引用'MyQueue :: MyQueue(int)''。 – tzkone

+0

@tzkone制作目标文件的目标也是错误的。 –

+0

哇!你是对的,我再试一次,结果是对的。但是,命令'$(OBJS):$(SRCS)'有什么问题? – tzkone

2

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

$(OBJS):$(SRCS) 
    $(CXX) $(CXXFLAGS) -c $< -o [email protected] 
+0

谢谢您的回复!我尝试你的解决方案,但结果仍然是错误的。像这样“main.cpp :(。text + 0x21):未定义的引用'MyQueue :: MyQueue(int)'”。 – tzkone