类模板的Makefile问题:clang警告链接器输入未使用
Makefile issue with Class template: clang warning linker input unused
我有两个类:一个带有定义和实现的类模板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"
指令。
相关文章:
- 在未链接的部分上生成警告
- 链接时突然收到maxrregcount警告和未定义的引用错误
- 为什么混合 -fexceptions 和 -fno 异常没有链接器警告
- C 链接器警告是因为虚拟击D驱动器 / clang
- 与其他库链接的静态库-LINKER警告
- 尝试解决链接器警告:默认库'MSVCRT'与使用其他库冲突
- 这个链接器警告的含义是什么,以及如何修复它
- 链接器不指出错误;多个定义警告指向同一行
- 发布模式下的正则表达式提升库链接在使用 mingw-w64 工具链时警告"duplicate section has different size"
- 警告LNK4206:找不到预编译类型信息; 未链接或覆盖;链接对象,就好像没有调试信息一样
- 在视觉C++ malloc 警告中静态链接 openssl
- 为什么 clang++ 警告内联enable_if然后无法链接
- 使用指向函数的指针的外部引用时的链接器警告
- 使用 CMake 禁止显示链接警告
- 链接 : 警告 LNK4098: 默认库 'MSVCRT' 与其他库的使用冲突;使用 /NODEFAULTLIB:Library
- 类模板的Makefile问题:clang警告链接器输入未使用
- VS2013的Qt4到Qt5迁移链接器警告(和错误)
- C++警告:没有用于声明变量的链接的匿名类型
- 为什么 g++ 链接器不警告这种不一致的函数声明?
- VS2010链接警告