我编写了一个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.h
,MyQueue.cpp
和main.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
答案 0 :(得分:4)
创建目标文件时,需要-c
选项。您没有,这意味着g++
尝试创建链接可执行文件main.o
。
构建目标文件的目标也是错误的。应该是例如。
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
答案 1 :(得分:2)
您必须使用-c
标志来转换目标文件中的源文件。
喜欢
$(OBJS):$(SRCS)
$(CXX) $(CXXFLAGS) -c $< -o $@