Альтернативная авторегистрация на C ++ (due -nostartfiles) - PullRequest
0 голосов
/ 02 июля 2018

Предположим, что в случае, когда центральному «контроллеру» нужны разные клиенты, использующие единый интерфейс. Каждый клиент реализован в отдельном .cpp файле (модуле). Функциональность каждого клиента неизвестна контроллеру. Существует известная хитрость, чтобы каждый модуль автоматически регистрировал своего клиента:

MyClient1.cpp

#include "client_inter"
class MyClient1 : public IClient
{ ... }
static MyClient1 client;
static int regStatus = register_client(&client);

Функция register_client реализована где-то внутри «контроллера». Он автоматически вызывается глобальным инициализатором, и поэтому модуль вводит своих клиентов в контроллер, не будучи непосредственно известным контроллеру.

Все это прекрасно работало до недавнего времени, когда в нашу инфраструктуру сборки GCC был добавлен ключ -nostartfiles . Теперь глобальный инициализатор не работает, и поэтому 'register_client' не вызывается, и клиент не зарегистрирован в контроллере.

Пока я пытаюсь удалить этот переключатель из сборки, мне может понадобиться альтернативный способ (даже специфичный для GCC), чтобы иметь те же функции.

Проблема в том, что существует много клиентов, и они не всегда присутствуют в сборке (это зависит от цели и конфигурации). Поэтому я не хочу, чтобы контроллер знал их все. Или пусть он «знает» их всех, но пропущенные символы не нарушат связывание.

...