是否可以编译一个外部依赖性在编译时无法解决的静态库? 我用C和C++创建了一个Web服务器,它的工作方式如下: 首先,它初始化连接的套接字 然后,当服务器接收到HTTP请求时,它调用一个函数,该函数将从请求中检索数据,并创建一个对象来解析传入的请求。(对象包含请求的参数和头) 然后,它调用名为HandleRequest的函数,并将创建的对象提供给他。对象的类型是我自己编写的Request HandlerRequest函数将分析请求,生成HTML文档,并以字符串形式返回整个文档 最后,服务器获取HandlerRequest函数返回的字符串并将其发送回客户端

是否可以编译一个外部依赖性在编译时无法解决的静态库? 我用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函数

我的观点是,我想把服务器本身打包到一个静态库中,然后当我想创建一个新网站时,我只需要编写HandleRequest函数,并在编译时链接静态库来创建服务器

当然,当我尝试这样做时,我有一个错误
对“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