是否可以编译具有在编译时无法解析的外部依赖项的静态库?

Is it possible to compile a static library with an external dependancy that is unresolvable at compilation time?

本文关键字:编译 外部 依赖 静态 是否      更新时间:2023-10-16

我使用 C 和 C++ 创建了一个 Web 服务器,它的工作方式如下:

  • 首先,它初始化连接的套接字。
  • 然后,当服务器收到HTTP请求时,它会调用一个函数,该函数将从请求中检索数据,并创建一个对象来解析传入的请求。(该对象包含请求的参数和标头)。
  • 然后,它调用一个名为 HandleRequest 的函数,并为他提供创建的对象。对象的类型是Request,这是我自己写的。
  • HandleRequest 函数将分析请求,生成 HTML 文档,并以字符串形式返回整个文档。
  • 最后,服务器获取 HandleRequest 函数返回的字符串并将其发送回客户端。

现在,如果我想创建另一个站点,我唯一需要更改的代码是 HandleRequest 函数。

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

当然,当我尝试这样做时,我有错误undefined reference to 'HandleRequest'

那么是否有可能使库编译,知道函数的代码是在库之外编写的?

编辑:我尝试在没有-c选项的情况下编译.cpp文件,以便库已经完成了链接。我知道使用-c选项,一切正常。

另外,我试图把extern std::string HandleRequest(Request request);在调用 HandleRequest 的函数之前,但它不起作用。

快速简便的解决方案

使HandleRequest成为函数指针的全局变量:

std::string (*HandleRequest)(Request);

您可以将旧HandleRequest函数的功能移动到类似DefaultHandleRequest中,甚至可以使用DefaultHandleRequest初始化函数指针:

std::string DefaultHandleRequest(Request request)
{
// stuff
}
std::string (*HandleRequest)(Request) = DefaultHandleRequest;

如果这样做,则无需更改任何其他代码,但可以随时更新HandleRequest

更彻底的解决方案

我们可以使此解决方案更加通用,使您能够在同一程序中运行多个服务器。

为此,请创建一个充当服务器的Server类。此类的实例将充当您的服务器。Server存储处理传入请求的std::function<std::string(Request)>。您可以根据需要随时分配或更新此设置。

设计Server,以便可以同时有多个实例,每个实例代表具有自己的HandleRequest功能的不同服务器/服务。