我写了一个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
最佳答案
当您创建目标文件时,您需要 -c
选项。您没有它,这意味着 g++
尝试创建并链接可执行文件 main.o
。
您构建目标文件的目标也是错误的。它应该是例如
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
关于c++ - 我的 Makefile 或 C++ 程序有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43406841/