是否可以编译具有在编译时无法解析的外部依赖项的静态库?
Is it possible to compile a static library with an external dependancy that is unresolvable at compilation time?
我使用 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
功能的不同服务器/服务。
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 良好做法:如何定义用于编译的外部库的路径
- 交叉编译时包括外部库
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 我正在为学校开发一个小班模板实验室,我的代码无法编译,它给了我一个未解析的外部符号
- 如何使用Makevars链接到RCPP中已经编译的外部共享库
- C++编译错误LNK2019:未解决的外部符号错误
- 错误 LNK 2019 在 c++ 中编译期间未解析的外部生成错误
- 编译示例 Cinder 项目时存在大量未解决的外部问题
- 是否可以编译具有在编译时无法解析的外部依赖项的静态库?
- QT-不能使用外部库进行交叉编译
- 编译轨道样品时的C 错误-LNK2019未解决的外部符号
- 在Linux上编译外部库
- 使用外部库进行编译
- 在 gcc 中使用数组参数编译外部"c"代码
- 你如何告诉Visual Studio编译外部库
- QtCreator:如何编译外部源文件
- 编译外部C++库以用于 iOS 项目
- 编译外部库时涉及增量(C1073)编译的错误