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

  • 首先,它初始化用于连接的套接字。
  • 然后,当服务器接收到HTTP请求时,它将调用一个函数,该函数将从请求中检索数据,并创建一个将分析传入请求的对象。 (对象包含请求的参数和 header )。
  • 然后,它调用一个名为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函数,代表一个不同的服务器/服务。

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

    10-12 15:35