C++ Избегание связывания библиотек

В настоящее время у меня есть настройка С++, подобная следующей

class FlowController
{
   public:
    //...
   private:
       cntrl::OneWayValve _intake;
}

Как видите, я использую экземпляр cntrl::OneWayValve в своем классе. Класс Valve находится в другой библиотеке, с которой я связываюсь во время компиляции. cntrl::OneWayValve имеет cntrl::Value в своей реализации.

class OneWayValve
{
   public:
    //...
   private:
       cntrl::Valve _valve;
}

И, как и раньше, cntrl::Valve находится в другой библиотеке по причинам, о которых вам придется спросить предыдущего разработчика.

Теперь, когда я компилирую свой класс FlowController, мне нужно связать библиотеку OneWayValve и библиотеку cntrl::Valve.

Мой вопрос: возможно ли связать только библиотеку cntrl::OneWayValve во время компиляции?

Форвардная декларация?
Статические библиотеки (на самом деле не хочется этого делать)?
Другая альтернатива?

По сути, я не хочу знать, что внутри используется cntrl::Valve, это не мое дело.

Примечание: извиняюсь, ОС Unix.

Привет, Бен


person Ben Crowhurst    schedule 19.01.2011    source источник
comment
Компиляция и компоновка несколько отличаются в разных операционных системах. Что ты используешь?   -  person tauran    schedule 19.01.2011


Ответы (3)


Что вы можете сделать, так это сделать свою библиотеку Valve частью вашей библиотеки OneWayValve, используя инструмент, называемый библиотекарем. Я не знаю, какую ОС / компилятор вы используете, поэтому я собираюсь описать, как это сделать с помощью Visual Studio, поскольку это единственная система, с которой я действительно делал это (если вы не хотите считать CP/M + LIB-80 :-)

Если вы откроете диалоговое окно Tools|Options для вашего проекта OneWayValve и выберете Configuration Properties|Librarian|Additional Dependencies, вы можете поместить ссылку на свою библиотеку Valve в параметр Additional Dependencies. Это приведет к тому, что OneWayValve.lib будет содержать все объекты, на которые он ссылается из Valve.lib.

person Ferruccio    schedule 19.01.2011
comment
Cheers GNU libtool, похоже, имеет то, что мне нужно. Спасибо за помощь. - person Ben Crowhurst; 21.01.2011

К сожалению для вас, OneWayValve не очень хорошо спроектирован. Вам нужно не только связать обе библиотеки, но вам также придется перекомпилировать как библиотеку OneWayValve, так и ваш код, если класс Valve изменится.

person Šimon Tóth    schedule 19.01.2011
comment
Откуда вы знаете, что OneWayValve не очень хорошо спроектирован? Я вижу только точки и один закрытый член. - person BЈовић; 19.01.2011
comment
@VJo Частный член - плохая причина дизайна. - person Šimon Tóth; 19.01.2011
comment
@Let_Me_Be Почему? Я согласен, что использование идиомы pimpl лучше, но нет ничего плохого в том, чтобы иметь приватные члены. - person BЈовић; 19.01.2011
comment
@VJo Это если определения этих членов находятся в другой библиотеке и классе в интерфейсе библиотеки. - person Šimon Tóth; 19.01.2011
comment
@Let_Me_Be В этом нет ничего плохого. Динамически свяжите эту библиотеку, и проблема решена. - person BЈовић; 19.01.2011
comment
@VJo Какая проблема решена? Проблема в том, что если нижняя библиотека изменится, это изменение нужно будет вручную распространить (путем перекомпиляции кода) по всем зависимостям вплоть до конечной программы. - person Šimon Tóth; 19.01.2011
comment
@Let_Me_Be Хорошо, я понимаю. Как я уже сказал, использование идиомы pimpl было бы лучше и предотвратило бы повторную компиляцию при добавлении большего количества элементов. Но если сигнатура класса изменится, потребуется перекомпиляция — с компоновкой или без компоновки библиотеки. - person BЈовић; 19.01.2011

Вы можете сделать это, определив все методы OneWayValve и Valve в их заголовках как встроенные. Тогда вам не нужно связываться с библиотекой.

Но если он был разработан таким образом, то какие проблемы вызывает ссылка на эту библиотеку? Нет ничего плохого в динамическом связывании библиотеки.

person BЈовић    schedule 19.01.2011
comment
Я бы предпочел не знать внутренностей класса OneWayValve, вот и все. - person Ben Crowhurst; 19.01.2011
comment
@Ben В этом случае найдите идиому pimpl. Я уверен, что вы получите миллион просмотров в Google. - person BЈовић; 20.01.2011
comment
Да, спасибо, я сейчас смотрю на эту дорогу. Спасибо всем за вашу помощь очень ценится. - person Ben Crowhurst; 20.01.2011