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

时间:2016-01-07 22:26:30

标签: c++ compilation makefile

我有2个类:带有定义和实现的类模板list.t,以及ticker.h和ticker.cpp,以及驱动程序main.cpp。我想编译main.cpp来获取main.x,它使用了ticker和list类。到目前为止,这是我的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
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 = '\0') 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的质量和结构有任何其他意见。关于为什么我的旗子显然未被使用的任何知识都将非常感谢!

谢谢!

2 个答案:

答案 0 :(得分:0)

只有在编译源文件以创建目标文件时,才需要在命令行中使用-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

答案 1 :(得分:0)

makefile应该如下:

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"指令。