是否可以编译一个外部依赖性在编译时无法解决的静态库? 我用C和C++创建了一个Web服务器,它的工作方式如下: 首先,它初始化连接的套接字 然后,当服务器接收到HTTP请求时,它调用一个函数,该函数将从请求中检索数据,并创建一个对象来解析传入的请求。(对象包含请求的参数和头) 然后,它调用名为HandleRequest的函数,并将创建的对象提供给他。对象的类型是我自己编写的Request HandlerRequest函数将分析请求,生成HTML文档,并以字符串形式返回整个文档 最后,服务器获取HandlerRequest函数返回的字符串并将其发送回客户端
现在,如果我想创建另一个站点,唯一需要更改的代码就是HandleRequest函数 我的观点是,我想把服务器本身打包到一个静态库中,然后当我想创建一个新网站时,我只需要编写HandleRequest函数,并在编译时链接静态库来创建服务器 当然,当我尝试这样做时,我有一个错误是否可以编译一个外部依赖性在编译时无法解决的静态库? 我用C和C++创建了一个Web服务器,它的工作方式如下: 首先,它初始化连接的套接字 然后,当服务器接收到HTTP请求时,它调用一个函数,该函数将从请求中检索数据,并创建一个对象来解析传入的请求。(对象包含请求的参数和头) 然后,它调用名为HandleRequest的函数,并将创建的对象提供给他。对象的类型是我自己编写的Request HandlerRequest函数将分析请求,生成HTML文档,并以字符串形式返回整个文档 最后,服务器获取HandlerRequest函数返回的字符串并将其发送回客户端,c++,static-libraries,static-linking,C++,Static Libraries,Static Linking,现在,如果我想创建另一个站点,唯一需要更改的代码就是HandleRequest函数 我的观点是,我想把服务器本身打包到一个静态库中,然后当我想创建一个新网站时,我只需要编写HandleRequest函数,并在编译时链接静态库来创建服务器 当然,当我尝试这样做时,我有一个错误 对“HandleRequest”的未定义引用 那么,在知道函数的代码是在库之外编写的情况下,是否可以使库编译 编辑:我尝试编译带有-c选项的.cpp文件,这样库就已经完成了链接。我知道使用-c选项,一切都可以正常工作 还有,
对“HandleRequest”的未定义引用
那么,在知道函数的代码是在库之外编写的情况下,是否可以使库编译
编辑:我尝试编译带有-c
选项的.cpp文件,这样库就已经完成了链接。我知道使用-c
选项,一切都可以正常工作
还有,我试着把
extern std::string HandleRequest(请求)代码>
在调用HandlerRequest但不起作用的函数之前。快速简便的解决方案
使HandleRequest
成为函数指针的全局变量:
std::string (*HandleRequest)(Request);
您可以将旧的HandleRequest
函数的功能移动到类似DefaultHandleRequest
的位置,甚至可以使用DefaultHandleRequest
初始化函数指针:
std::string DefaultHandleRequest(Request request)
{
// stuff
}
std::string (*HandleRequest)(Request) = DefaultHandleRequest;
如果您这样做,就不必更改任何其他代码,但您可以随时更新HandleRequest
更彻底的解决方案
我们可以使这个解决方案更加通用,使您能够在同一个程序中运行多个服务器
为此,创建一个充当服务器的Server
类。此类的实例将充当您的服务器。让服务器
存储处理传入请求的std::函数
。您可以根据需要随时分配或更新此项
设计Server
以便一次可以有多个实例,每个实例都代表一个不同的服务器/服务,并具有自己的HandleRequest
功能。快速简便的解决方案
使HandleRequest
成为函数指针的全局变量:
std::string (*HandleRequest)(Request);
您可以将旧的HandleRequest
函数的功能移动到类似DefaultHandleRequest
的位置,甚至可以使用DefaultHandleRequest
初始化函数指针:
std::string DefaultHandleRequest(Request request)
{
// stuff
}
std::string (*HandleRequest)(Request) = DefaultHandleRequest;
如果您这样做,就不必更改任何其他代码,但您可以随时更新HandleRequest
更彻底的解决方案
我们可以使这个解决方案更加通用,使您能够在同一个程序中运行多个服务器
为此,创建一个充当服务器的Server
类。此类的实例将充当您的服务器。让服务器
存储处理传入请求的std::函数
。您可以根据需要随时分配或更新此项
设计Server
以便一次可以有多个实例,每个实例都用自己的HandleRequest
功能表示不同的服务器/服务。我不是一个服务器迷,但我想知道你是否可以通过HandleRequest的友元功能来实现这一点。。。?其他人可能更了解如何编译它。你需要把它链接起来。为此,您需要“外部库”。一定要注意你收到的错误信息。这取决于你所说的“静态库”是什么意思。如果它是一个.lib
文件,实际上是一组(编译的).obj
文件放在一起,那么没有问题,您只需要在项目中链接包含HandlerRequest
实现的另一个对象或库文件(或者只需在项目中实现它并给它extern
存储类)。甚至类成员实现(“定义”)也可以包含在多个源/对象文件中。如果您指的是静态链接的dll,则需要定义一些回调机制或使用@Jorge Perez建议的函数指针变量。我得到的完整消息错误是未定义对`HandleRequest[abi:cx11](Request)
,而“static library”指的是.a
文件,如libws2\u 2.a
。如果我使用g++-shared-fPIC-o libserver.a
编译服务器库,我就有错误,如果我使用从google获得的方法(使用GNU的ar
程序),那么在将服务器库与我的HandlerRequest实现相链接时,可执行文件的格式不正确。我不是一个服务器人员,但我想知道您是否可以通过HandlerRequest的friend函数来完成这一点。。。?其他人可能更了解如何编译它。你需要把它链接起来。为此,您需要“外部库”。一定要注意你收到的错误信息。这取决于你所说的“静态库”是什么意思。如果它是一个.lib
文件,实际上是一组(编译的).obj
文件放在一起,那么没有问题,您只需要链接另一个对象或li