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

标签 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

最佳答案

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


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

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

关于c++ - 我的 Makefile 或 C++ 程序有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43406841/

相关文章:

c++ - 计算最小点积 C++

c++ - 尝试解除分配 char 数组 : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 的指针时出错

c++ - 需要帮助在 Windows 上正确设置 CLANG

c++ - 从 SVN checkout 的 ROS 包。无法在 eclipse 上构建它

c++ - Makefile:没有规则的依赖项不会使父项无效

c++ - 基于 Python 的构建工具

bash - Makefile 中的函数

c++ - 如果全局定义,为什么 std::ifstream 不更新

c++ - GCC 链接静态库

c++ - Makefile 重复符号