是否可以编译具有在编译时无法解析的外部依赖项的静态库?
Is it possible to compile a static library with an external dependancy that is unresolvable at compilation time?
我使用 C 和 C++ 创建了一个 Web 服务器,它的工作方式如下:
- 首先,它初始化连接的套接字。
- 然后,当服务器收到 HTTP 请求时,它会调用一个函数来从请求中检索数据,并创建一个 object 来解析传入的请求。 (object 包含请求的参数和 headers)。
- 然后,它调用了一个名为HandleRequest 的函数,并将object 创建的给他。 object的类型是我自己写的
Request
。
- HandleRequest 函数将分析请求,生成一个 HTML 文档,并且 returns 整个文档作为一个字符串。
- 最后,服务器将HandleRequest函数返回的字符串返回给客户端。
现在,如果我想创建另一个站点,我唯一需要更改的代码就是 HandleRequest 函数。
我的意思是想把服务器本身打包成一个静态库,然后在做新网站的时候,只需要在编译的时候写HandleRequest函数和link静态库制作服务器。
当然,当我尝试这样做时,出现了错误
undefined reference to 'HandleRequest'
知道函数的代码是在库之外编写的,是否可以编译库?
编辑:我尝试在不使用 -c
选项的情况下编译 .cpp 文件,因此库已经完成了 linking。我知道使用 -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
class,作为服务器。此 class 的一个实例将充当您的服务器。让 Server
存储一个 std::function<std::string(Request)>
来处理传入的请求。您可以根据需要随时分配或更新它。
设计 Server
以便同时可以有多个实例,每个实例代表一个不同的 server/service,具有自己的 HandleRequest
功能。
我使用 C 和 C++ 创建了一个 Web 服务器,它的工作方式如下:
- 首先,它初始化连接的套接字。
- 然后,当服务器收到 HTTP 请求时,它会调用一个函数来从请求中检索数据,并创建一个 object 来解析传入的请求。 (object 包含请求的参数和 headers)。
- 然后,它调用了一个名为HandleRequest 的函数,并将object 创建的给他。 object的类型是我自己写的
Request
。 - HandleRequest 函数将分析请求,生成一个 HTML 文档,并且 returns 整个文档作为一个字符串。
- 最后,服务器将HandleRequest函数返回的字符串返回给客户端。
现在,如果我想创建另一个站点,我唯一需要更改的代码就是 HandleRequest 函数。
我的意思是想把服务器本身打包成一个静态库,然后在做新网站的时候,只需要在编译的时候写HandleRequest函数和link静态库制作服务器。
当然,当我尝试这样做时,出现了错误
undefined reference to 'HandleRequest'
知道函数的代码是在库之外编写的,是否可以编译库?
编辑:我尝试在不使用 -c
选项的情况下编译 .cpp 文件,因此库已经完成了 linking。我知道使用 -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
class,作为服务器。此 class 的一个实例将充当您的服务器。让 Server
存储一个 std::function<std::string(Request)>
来处理传入的请求。您可以根据需要随时分配或更新它。
设计 Server
以便同时可以有多个实例,每个实例代表一个不同的 server/service,具有自己的 HandleRequest
功能。