Рассмотрение аргументов вашего коллеги
Если он полагает, что разбиение вашего кода на разделяемые библиотеки улучшит модульность кода, тестируемость и повторное использование, тогда я предполагаю, что это означает, что он полагает, что у вас есть некоторые проблемы с вашим кодом, и что принудительное использование архитектуры «разделяемой библиотеки» исправит это .
Модульность
Ваш код должен иметь нежелательные взаимозависимости, которых не было бы при более четком разделении между «библиотечным кодом» и «кодом с использованием библиотечного кода».
Теперь это можно сделать и с помощью статических библиотек.
Тестирование
Ваш код может быть протестирован лучше, возможно, построение модульных тестов для каждой отдельной общей библиотеки, автоматизированной при каждой компиляции.
Теперь это можно сделать и с помощью статических библиотек.
Повторное использование кода?
Ваш коллега хотел бы повторно использовать некоторый код, который не отображается, потому что скрыт в источниках вашего монолитного приложения.
Заключение
Точки 1 и 2 все еще могут быть достигнуты с помощью статических библиотек. 3 сделает общие библиотеки обязательными.
Теперь, если у вас есть более одной глубины связывания библиотек (я думаю о связывании двух статических библиотек, которые уже были скомпилированы, связывая другие библиотеки), это может быть сложно. В Windows это приводит к ошибке связывания, поскольку на некоторые функции (обычно на функции времени выполнения C / C ++, когда они связаны статически) ссылаются более одного раза, и компилятор не может выбрать, какую функцию вызывать. Я не знаю, как это работает в Linux, но я думаю, это тоже может произойти.
Разбирая свои аргументы
Ваши собственные аргументы несколько предвзяты:
Бремя компиляции / компоновки разделяемых библиотек?
Бремя компиляции и связывания с общими библиотеками по сравнению с компиляцией и связыванием со статическими библиотеками отсутствует. Так что этот аргумент не имеет значения.
Динамически загружать / выгружать?
Динамическая загрузка / выгрузка разделяемой библиотеки может быть проблемой в очень ограниченном случае использования. В обычных случаях ОС загружает / выгружает библиотеку, когда это необходимо, без вашего вмешательства, и в любом случае ваши проблемы с производительностью лежат в другом месте.
Предоставление кода C ++ с интерфейсами C?
Что касается использования интерфейса C-функций для вашего кода C ++, я не понимаю: вы уже связываете статические библиотеки с интерфейсом C ++. Связывание разделяемых библиотек ничем не отличается.
У вас возникнет проблема, если у вас будут разные компиляторы для создания каждой библиотеки вашего приложения, но это не так, поскольку вы уже статически связываете свои библиотеки.
Отдельный двоичный файл проще?
Ты прав.
В Windows разница незначительна, но, тем не менее, по-прежнему существует проблема DLL Hell , которая исчезает, если вы добавляете версию в имена своей библиотеки или работаете с Windows XP.
В Linux, в дополнение к описанной выше проблеме Windows, у вас есть тот факт, что по умолчанию общие библиотеки должны находиться в некоторых системных каталогах по умолчанию, чтобы их можно было использовать, поэтому вам придется копировать их туда при установке (что может быть боль ...) или изменить некоторые настройки среды по умолчанию (что тоже может быть боль ...)
Вывод: кто прав?
Теперь ваша проблема не в том, "прав ли мой коллега?" Он. Как и вы тоже.
Ваша проблема:
- Чего вы действительно хотите достичь?
- Стоит ли работа, необходимая для этой задачи?
Первый вопрос очень важен, так как мне кажется, что ваши аргументы и аргументы вашего коллеги необъективны, чтобы привести к выводу, который кажется более естественным для каждого из вас.
Поместите это в другую формулировку: каждый из вас уже знает, каким должно быть идеальное решение (в соответствии с каждой точкой зрения), и каждый из вас собирает аргументы для достижения этого решения.
Нет способа ответить на этот скрытый вопрос ...
^ _ ^