在书的P67 第3。7节的示例中的
extern char* get_url_pathname(ACE_SOCK_Stream *);
函数是那里冒出来的
我按照书中提供的ACE-INSTALL.html提供的步骤配置的ACE的环境。其他的示例都可以正常的编译运行。
而运行该节的程序时却遇到问题,编译器的提示如下:
main.obj : error LNK2019: 无法解析的外部符号 "char * __cdecl get_url_pathname(class ACE_SOCK_Stream *)" (?get_url_pathname@@YAPADPAVACE_SOCK_Stream@@@Z) ,该符号在函数 "int __cdecl ace_main_i(int,char * * const)" (?ace_main_i@@YAHHQAPAD@Z) 中被引用
Debug/ACEServer.exe : fatal error LNK1120: 1 个无法解析的外部命令
---------------
程序如下:
#include "ace/Auto_Ptr.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#include "ace/Mem_Map.h"
extern char* get_url_pathname(ACE_SOCK_Stream *);
int main(int argc, char* argv[])
{
ACE_INET_Addr server_addr;
ACE_SOCK_Acceptor acceptor;
ACE_SOCK_Stream peer;
if (server_addr.set (80) == -1)
return 1;
if (acceptor.open (server_addr) == -1)
return 1;
for( ; ; )
{
if (acceptor.accept(peer) == -1)
return 1;
peer.disable (ACE_NONBLOCK);
ACE_Auto_Array_Ptr <char> pathname(get_url_pathname(&peer));
ACE_Mem_Map mapped_file (pathname.get());
if (peer.send_n (mapped_file.addr (), mapped_file.size ()) == -1)
return 1;
peer.close();
}
return acceptor.close() == -1 ? 1 : 0;
}
--------------------------------
敬请各位指点,谢谢。
http://community.csdn.net/Expert/topic/3997/3997893.xml?temp=.8427698
extern char* get_url_pathname(ACE_SOCK_Stream *);
函数是那里冒出来的
我按照书中提供的ACE-INSTALL.html提供的步骤配置的ACE的环境。其他的示例都可以正常的编译运行。
而运行该节的程序时却遇到问题,编译器的提示如下:
main.obj : error LNK2019: 无法解析的外部符号 "char * __cdecl get_url_pathname(class ACE_SOCK_Stream *)" (?get_url_pathname@@YAPADPAVACE_SOCK_Stream@@@Z) ,该符号在函数 "int __cdecl ace_main_i(int,char * * const)" (?ace_main_i@@YAHHQAPAD@Z) 中被引用
Debug/ACEServer.exe : fatal error LNK1120: 1 个无法解析的外部命令
---------------
程序如下:
#include "ace/Auto_Ptr.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#include "ace/Mem_Map.h"
extern char* get_url_pathname(ACE_SOCK_Stream *);
int main(int argc, char* argv[])
{
ACE_INET_Addr server_addr;
ACE_SOCK_Acceptor acceptor;
ACE_SOCK_Stream peer;
if (server_addr.set (80) == -1)
return 1;
if (acceptor.open (server_addr) == -1)
return 1;
for( ; ; )
{
if (acceptor.accept(peer) == -1)
return 1;
peer.disable (ACE_NONBLOCK);
ACE_Auto_Array_Ptr <char> pathname(get_url_pathname(&peer));
ACE_Mem_Map mapped_file (pathname.get());
if (peer.send_n (mapped_file.addr (), mapped_file.size ()) == -1)
return 1;
peer.close();
}
return acceptor.close() == -1 ? 1 : 0;
}
--------------------------------
敬请各位指点,谢谢。
http://community.csdn.net/Expert/topic/3997/3997893.xml?temp=.8427698
从函数声明来看,这是一个例子中自定义的一个函数,
因为ACE并不提供这种类型的全局函数(其全局函数均使用Wrapper 模式进行类封装),你可以注意一下是否有别的cpp没有包括在工程中。
extern char* get_url_pathname(ACE_SOCK_Stream *); 另外,从例子来看这个函数的如何实现并不是重点,可以随意返回一个串,并不影响例子的示范作用。
好像并非如此,因为作者在上文中已经提到,get_url_pathname(ACE_SOCK_Stream *stream)函数是要获取stream连接中客户请求的url。
这个函数要自己写么?,那为什么要用 extern 呢?
我的意思很明确,就是这个函数是不影响例子的示范作用,原因我已经提及。
该例子的目的是为了演示SOCK_Acceptor的使用,而非别的,get_url_pathname的返回值只是被简单的写入了一个文件
你得意思是说这个例子只是一个示范用得例子么?