我有两个类:一个带有定义和实现的类模板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"
指令。