我已经使用C和C++创建了一个Web服务器,其工作方式如下:
Request
,这是我自己编写的。 现在,如果要创建另一个站点,则只需更改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/