类模板的Makefile问题:clang警告链接器输入未使用

Makefile issue with Class template: clang warning linker input unused

本文关键字:链接 警告 输入 未使用 clang Makefile 问题      更新时间:2023-10-16

我有两个类:一个带有定义和实现的类模板list.t,ticker.h和ticker.cpp,以及一个驱动程序main.cpp。我想编译main.cpp以获得同时使用ticker和list类的main.x。到目前为止,这是我的makefile。

# makefile for fx project
CC = g++
CFLAGS = -g -Wall -Wextra
default: main.x
main.x: main.o ticker.o list.o
    $(CC) $(CFLAGS) -o $@  main.o list.o ticker.o
list.o: list.t
    $(CC) -c list.t
ticker.o: ticker.cpp
      $(CC) -c ticker.cpp list.t
main.o: list.t ticker.cpp main.cpp
    $(CC) -c  main.cpp ticker.cpp list.t

但是在执行命令make时,我得到了以下错误:

make
g++ -c  main.cpp ticker.cpp list.t
clang: warning: list.t: 'linker' input unused
g++ -c list.t
clang: warning: list.t: 'linker' input unused
g++ -g -Wall -Wextra -o main.x  main.o list.o ticker.o
clang: error: no such file or directory: 'list.o'
make: *** [main.x] Error 1

List.t-(未实现)

#ifndef LIST_T
#define LIST_T
#include <iostream>
template <typename T>
class List
{
public:
  // constructors
  List();
  List(T);
  List(const List&);
  ~List();
  // member functions
  List& operator = (const List&);
  void PushFront (const T&);
  void PushBack (const T&);
  T PopFront();
  T PopBack();
  T& Front();
  T& Back();
  const T& Front() const;
  const T& Back() const;
  size_t Size() const;
  bool Empty() const;
  void Clear();
  void Display (std::ostream&, char = '') const;
    //private vars
  private:
    class Link
    {
      Link (const T& t) : element_(t), nextLink_(0), previousLink_(0) {};
      T element_;
      Link* nextLink_;
      Link* previousLink_;
      friend class List<T>;
    };
    Link* firstLink_;
    Link* lastLink_;
  };

我确信这是一个简单的错误,我已经在谷歌上搜索了这个错误消息,但我要么不完全理解他们的解决方案,要么他们不适合我。无论哪种方式,请告诉我你是否有解决这个问题的方案,或者对这个makefile的质量和结构有任何其他评论。此外,如果知道为什么我的国旗显然没有被使用,我们将不胜感激!

谢谢!

只有在编译源文件以创建对象文件时,才需要在命令行中使用-c

更改

main.x: main.o ticker.o list.o
        $(CC) $(CFLAGS) -c main.o list.o ticker.o

main.x: main.o ticker.o list.o
        $(CC) $(CFLAGS) -o $@ main.o list.o ticker.o
                        ^^^^^

$@是规则目标的文件名。

有关更多此类变量,请参阅GNU make:Automatic Variables。

生成文件应该如下:

CC = g++
CPPFLAGS = -g -Wall -Wextra
default: main.x
main.x: main.o ticker.o
    $(CC) -o $@  main.o ticker.o
ticker.o: ticker.cpp
    $(CC) -c ticker.cpp $(CPPFLAGS) 
main.o: list.t main.cpp
    $(CC) -c  main.cpp $(CPPFLAGS) 

您没有编译模板文件。实现应该与类声明在同一个文件中(最好放上.hpp扩展名)。然后模板必须包含在其他文件中。例如,在main中,放置一个#include "list.t"指令。