问题描述
- 高人来帮助下小弟,纠结到吐血的问题
-
先上下vs2010报错代码1> 正在创建库 D:QtprojectsrcServerDebugServer.lib 和对象 D:QtprojectsrcServerDebugServer.exp
1>net_comm.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall tcp_session::write(class tcp_message *)" (?write@tcp_session@@QAEXPAVtcp_message@@@Z),该符号在函数 "private: bool __thiscall net_comm::send_msg(class tcp_message * &)" (?send_msg@net_comm@@AAE_NAAPAVtcp_message@@@Z) 中被引用
1>net_comm.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall tcp_session::close(void)" (?close@tcp_session@@QAEXXZ),该符号在函数 "protected: bool __thiscall net_comm::send_packet(class boost::shared_ptr &,class serial_packet &)" (?send_packet@net_comm@@IAE_NAAV?$shared_ptr@Vtcp_session@@@boost@@AAVserial_packet@@@Z) 中被引用
1>net_comm.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall tcp_session::isconnected(void)" (?isconnected@tcp_session@@QAE_NXZ),该符号在函数 "protected: bool __thiscall net_comm::send_packet(class boost::shared_ptr &,class serial_packet &)" (?send_packet@net_comm@@IAE_NAAV?$shared_ptr@Vtcp_session@@@boost@@AAVserial_packet@@@Z) 中被引用
1>net_comm.obj : error LNK2019: 无法解析的外部符号 "public: class boost::asio::basic_stream_socket > & __thiscall tcp_session::socket(void)" (?socket@tcp_session@@QAEAAV?$basic_stream_socket@Vtcp@ip@asio@boost@@V?$stream_socket_service@Vtcp@ip@asio@boost@@@34@@asio@boost@@XZ),该符号在函数 "protected: bool __thiscall net_comm::send_packet(class boost::shared_ptr &,class serial_packet &)" (?send_packet@net_comm@@IAE_NAAV?$shared_ptr@Vtcp_session@@@boost@@AAVserial_packet@@@Z) 中被引用
1>ServerNetwork.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall tcp_server::tcp_server(unsigned short,class net_comm *,int)" (??0tcp_server@@QAE@GPAVnet_comm@@H@Z),该符号在函数 "class boost::shared_ptr __cdecl boost::make_shared(int &,class ServerNetwork * const &&,int &)" (??$make_shared@Vtcp_server@@AAHQAVServerNetwork@@AAH@boost@@YA?AV?$shared_ptr@Vtcp_server@@@0@AAH$$QBQAVServerNetwork@@0@Z) 中被引用
1>D:QtprojectsrcServerDebugServer.exe : fatal error LNK1120: 5 个无法解析的外部命令
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========这个错误write() close() isconnected() 我函数里都是有明确定义 为什么还是报这个错 生成的时候报的错?
解决方案
这个相关的文件代码 net_comm.cpp
#include "net_comm.hpp"
#include
#pragma warning(disable:4355)
#pragma warning(disable:4996)
#pragma comment(lib,"ws2_32.lib")
#pragma comment( lib, "vfw32.lib" )
net_comm::net_comm(int sec_check):
m_req_worker(m_recvq), m_resp_worker(m_sendq)
{
m_req_worker.set_workerFunc(boost::bind(&net_comm::process_msg, this, _1));
m_resp_worker.set_workerFunc(boost::bind(&net_comm::send_msg, this, _1));
//每隔sec_check秒向会话端发送一次检测包
m_schedule.add(boost::bind(&net_comm::check_session_status, this), sec_check);
//开始
m_schedule.start();
}
//启动工作线程
void net_comm::start()
{
m_req_worker.start();
m_resp_worker.start();
}
net_comm::req_queue_type &net_comm::recv_queue()
{
return m_recvq;
}
//以下两个函数是供调用的回调函数
bool net_comm::process_msg(tcp_request_ptr &req)
{
msg_head *head = req->get_head();
serial_packet *p = m_packetfactory.generate_packet(static_cast(head->type), req->msg_data(), head->size);
if (p)
{
return proc_packet(req->get_session(), p);
}
return false;
}
**bool net_comm::send_msg(tcp_response_ptr &resp)
{
resp->set_msg_crc();
resp->get_session()->write(resp);
return true;
}**
bool net_comm::session_connected(tcp_session_ptr &session)
{
proc_connect(session);
return add_session(session);
}
bool net_comm::session_disconnected(tcp_session_ptr &session)
{
proc_disconnect(session);
return remove_session(session);
}
bool net_comm::send_packet(tcp_session_ptr &sp, serial_packet &packet)
{
//每一次发包之前先检测该连接的状态
if (!sp->socket().is_open() || !sp->isconnected())
{
sp->close();
return false;
}
tcp_response_ptr resp = boost::factory()(sp);
generate_session_data(resp, packet);
m_sendq.push(resp);
return true;
}
void net_comm::generate_session_data(tcp_response_ptr &resp, serial_packet &packet)
{
//1.构建输出流,将packet中的数据序列化至buf
char buf[SEND_BUFFER];
memset(buf, 0, SEND_BUFFER);
stream sa(buf);
text_oarchive oa(sa);
packet.serial(oa);
//2.构建消息头
msg_head head;
head.type = packet.get_packet_type();
std::string strbuf(buf);
head.size = static_cast<uint32_t>(strbuf.size());
head.chksum = std::for_each(strbuf.begin(), strbuf.end(), crc_32_type())();
//3.赋值
resp->get_head()->chksum = head.chksum;
resp->get_head()->size = head.size;
resp->get_head()->type = head.type;
std::copy(strbuf.begin(),
strbuf.begin() + strbuf.size(),
resp->msg_data().begin());
}
bool net_comm::add_session(const tcp_session_ptr &session)
{
//如果该会话端没有在列表中才加入
if (!m_tcp_sessions.find(session))
{
m_tcp_sessions.push_back(session);
return true;
}
return false;
}
bool net_comm::remove_session(const tcp_session_ptr &session)
{
return m_tcp_sessions.remove(session);
}
void net_comm::check_session_status()
{
}
解决方案二:
我用的是BOOST库 这个是实现wtire函数的文件
#include "tcp_session.hpp"
#include
#include
#include
using namespace std;
#include
#pragma once
using namespace boost;
using namespace boost::asio;
tcp_session::object_pool_type tcp_session::m_msg_pool;
tcp_session::tcp_session(ios_type &ios, queue_type &q):
m_socket(ios), m_strand(ios), m_queue(q), m_bconnected(false)
{
}
tcp_session::socket_type &tcp_session::socket()
{
return m_socket;
}
tcp_session::ios_type &tcp_session::io_service()
{
return m_socket.get_io_service();
}
void tcp_session::start()
{
//说明该会话已连接
setconnected(true);
//表示有一个会话端连接
if (m_connect_func)
{
m_connect_func(shared_from_this());
}
read_data();
}
void tcp_session::close()
{
//当当前连接状态变为断开状态时调用断开连接的回调函数
if (isconnected())
{
if (m_disconnect_func)
{
m_disconnect_func(shared_from_this());
}
}
setconnected(false);
m_socket.close();
}
void tcp_session::set_callbackfunc(function_type &connfunc, function_type &disconnfunc)
{
m_connect_func = connfunc;
m_disconnect_func = disconnfunc;
}
void tcp_session::read_data()
{
//step3-->创建消息对象
tcp_request_ptr req = create_request();
//启动异步读取
read(req);
}
//使用内存池创建tcp_message对象
tcp_request_ptr tcp_session::create_request()
{
//此处将tcp_session与tcp_message绑定在一起
return m_msg_pool.construct(shared_from_this());
}
void tcp_session::setconnected(bool bFlag)
{
m_bconnected.setValue(bFlag);
}
//关闭TCP连接
//启动异步读
void tcp_session::read(tcp_request_ptr req)
{
//step4-->异步读取消息头
boost::asio::async_read(m_socket,
boost::asio::buffer(req->head_data().data(),
req->head_data().size()),
m_strand.wrap(
boost::bind(&tcp_session::handle_read_head, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
req)));
}
//异步读取消息头
void tcp_session::handle_read_head(const boost::system::error_code &error,
size_t bytes_transferred,
tcp_request_ptr req)
{
//检查消息头是否正确,消息头正确,再读取消息体
if (error || !req->check_head())
{
close();
return;
}
//step5-->异步读取消息体
boost::asio::async_read(m_socket,
boost::asio::buffer(req->msg_data().data(), req->get_head()->size),
m_strand.wrap(
boost::bind(&tcp_session::handle_read_msg,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
req)));
}
//异步读取消息
void tcp_session::handle_read_msg(const boost::system::error_code &error,
size_t byte_transferred,
tcp_request_ptr req)
{
bool bRight = req->check_msg_crc();
//检查消息体是否正确
if (error || !bRight)
{
close();
return;
}
//step6-->将收到的消息加入到job_queue
//m_queue是从外部传来的消息队列
//此处是将该连接读取的所有数据都保存在该队列中
//类似于生产者
m_queue.push(req);
//启动新的异步读
read_data();
}
bool tcp_session::isconnected()
{
bool bFlag = false;
m_bconnected.getValue(bFlag);
return bFlag;
}
/ * /启动异步写
void tcp_session::write(tcp_response_ptr resp)
{
boost::asio::async_write(m_socket,
boost::asio::buffer(resp->head_data().data(), resp->head_data().size()),
m_strand.wrap(
boost::bind(&tcp_session::handle_write_head,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
resp)));
}
void tcp_session::handle_write_head(const boost::system::error_code &error,
size_t bytes_transferred,
tcp_response_ptr resp)
{
if (error || bytes_transferred != resp->head_data().size())
{
close();
return;
}
boost::asio::async_write(m_socket,
boost::asio::buffer(resp->msg_data().data(), resp->get_head()->size),
m_strand.wrap(
boost::bind(&tcp_session::handle_write_msg,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
resp)));
} *
void tcp_session::handle_write_msg(const boost::system::error_code &error,
size_t byte_transferred,
tcp_response_ptr resq)
{
if (error || byte_transferred != resq->get_head()->size)
{
close();
return;
}
//消息发送完毕以后,就应该释放内存
resq->destroy();
}