簡體   English   中英

類模板的Makefile問題:clang警告鏈接器輸入未使用

[英]Makefile issue with Class template: clang warning linker input unused

我有2個類:具有定義和實現的類模板list.t,以及ticker.h和ticker.cpp,以及驅動程序main.cpp。 我想編譯main.cpp以獲得同時使用代碼和列表類的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
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_;
  };

我確定這是一個簡單的錯誤,並且我已經在Google上搜索了此錯誤消息,但是我或者沒有完全了解他們的解決方案,或者他們沒有為我工作。 無論哪種方式,請讓我知道您是否有解決此問題的方法,或者對此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:自動變量。

生成文件應為以下內容:

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擴展名放在同一文件中)。 然后,該模板必須包含在其他文件中。 例如,在主機中放入#include "list.t"指令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM