undefined reference to xxx之链接含有模板类的.o文件
问题情况描述
编译一个简易服务器时,包含了多个.hpp和多个.cpp文件,将其成功编译为.o文件,在链接这些.o文件时,报错一个类的成员函数找不到其定义。
如下图
检查情况
- 判断函数是否是自己定义的函数还是其他的库函数 :若是库函数就是你没有将其对应的库链接上使用 -l[库名]、-L[库路径],有很多这种教程搜一搜,就可以找到,如果是自己定义的函数就继续往下看。
- 检查函数名、参数在定义和声明是否相同:相同,继续往下看,不相同,就改成相同的试试。
- 检查报错的函数对应的类是否是模板类:不是以上这些情况我还没遇到,是模板类,使用一下解决办法:
###解决步骤:
在类的实现文件即.cpp文件中,在文末加上template class [类名]<使用时对应的类>
例子如下
#include <pthread.h>
#include <queue>
template<typename T>
class MsgQueue{
public:
MsgQueue();
~MsgQueue();
void Pop(T *msg);
void Push(const T& msg);
private:
std::queue<T> m_que;
pthread_mutex_t m_lock;
pthread_cond_t m_prod;
pthread_cond_t m_cons;
};
.cpp
#include "MsgQueue.hpp"
template<typename T>
MsgQueue<T>::MsgQueue(){
//....
}
template<typename T>
MsgQueue<T>::~MsgQueue(){
//.....
}
template<typename T>
void MsgQueue<T>::Pop(T *msg){
//.....
}
void MsgQueue<T>::Push(const T& msg)
{
//......
}
//在其他文件中我要使用MsgQueue<int>那么此处加上
template class MsgQueue<int>
//在其他文件中还要使用MsgQueue<ChatMsg>那么就继续加上
template class MsgQueue<ChatMsg>
最后执行链接命令就成功了
这样做的原因,此时我理解的是编译时就要实例化,而模板类,编译时不清楚自己实例化时对应的类,所以使用此语句告知模板类需要实例化出类。
重要提示!!!!
若有大佬发现有误之处,望不吝指教,感谢感谢!!!