gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:49 25 4
gpt4 key购买 nike

我已经使用 C 和 C++ 创建了一个网络服务器,其工作方式如下:

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

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

我的意思是想把服务器本身打包成一个静态库,然后在做新网站的时候,只需要写HandleRequest函数,在编译的时候链接静态库就可以做服务器了。

当然,当我尝试这样做时,我有错误对“HandleRequest”的 undefined reference

知道函数的代码是在库之外编写的,是否可以编译库?

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

另外,我试着把extern std::string HandleRequest(请求请求);在调用 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功能。

关于c++ - 是否可以编译具有在编译时无法解析的外部依赖项的静态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55598012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com