Можно ли скомпилировать статическую библиотеку с внешней зависимостью, которая неразрешима во время компиляции? - PullRequest
1 голос
/ 09 апреля 2019

Я создал веб-сервер с использованием C и C ++, который работает следующим образом:

  • Сначала он инициализирует сокет для подключения.
  • Затем, когдасервер получает HTTP-запрос, он вызывает функцию, которая извлечет данные из запроса и создаст объект, который будет анализировать входящий запрос.(Объект содержит параметры и заголовки запроса).
  • Затем он вызывает функцию с именем HandleRequest и предоставляет ему созданный объект.Тип объекта - Request, который я написал сам.
  • Функция HandleRequest проанализирует запрос, сгенерирует HTML-документ и вернет весь документ в виде строки.
  • Наконец, TheСервер берет строку, возвращенную функцией HandleRequest, и отправляет ее обратно клиенту.

Теперь, если я хочу создать другой сайт, единственный код, который мне нужно будет изменить, - это функция HandleRequest.

Суть в том, что я хочу упаковать сам сервер в статическую библиотеку, а затем, когда я хочу создать новый веб-сайт, мне нужно только написать функцию HandleRequest и связать статическую библиотеку при компиляции, чтобы сделать сервер.

Конечно, когда я пытаюсь это сделать, у меня появляется ошибка undefined reference to 'HandleRequest'

Так что возможно заставить библиотеку компилироваться, зная, что у функции есть свой код, написанный внебиблиотека?

Кроме того, я попытался поставить extern std::string HandleRequest(Request request); перед функцией, которая вызывает HandleRequest, но она не сработала.

1 Ответ

0 голосов
/ 09 апреля 2019

Быстрое и простое решение

Сделайте 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...