2 tcdexcu TCDEXCU 于 2014.10.25 10:06 提问

高人来帮助下小弟,纠结到吐血的问题

先上下vs2010报错代码

1> 正在创建库 D:\Qtproject\src\Server\Debug\Server.lib 和对象 D:\Qtproject\src\Server\Debug\Server.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:\Qtproject\src\Server\Debug\Server.exe : fatal error LNK1120: 5 个无法解析的外部命令
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

这个错误write() close() isconnected() 我函数里都是有明确定义 为什么还是报这个错 生成的时候报的错?

2个回答

TCDEXCU
TCDEXCU   2014.10.25 10:15

这个相关的文件代码 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()
{

}

TCDEXCU
TCDEXCU   2014.10.25 10:19

我用的是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();

}

Csdn user default icon
上传中...
上传图片
插入图片