我有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的质量和结构有任何其他意见。关于为什么我的旗子显然未被使用的任何知识都将非常感谢!
谢谢!
答案 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"
指令。