@kriptonus

Как лучше вносить изменения в стороннюю библиотеку С?

Добрый день, подскажите стратегию поведения: есть существующая библиотека на С (libmodbus). Но нужно добавить некоторый функционал: переключать преобразователь в режим приема/передачи, для этого преусмотрено управление через gpio. Добавить получается только в существующую функцию. Собственно, вопрос в том, как, исходя из вашего опыта, лучше внести изменения, чтобы избежать больших проблем при дальнейшей поддержке? Пока созрело только два варианта: либо вносить изменения в существующий код, либо переписать функцию. Если переписывать, как лучше ее переопределить?
  • Вопрос задан
  • 330 просмотров
Пригласить эксперта
Ответы на вопрос 4
Непонятно, какие у этой библиотеки есть точки расширения, какие есть интерфейсы. Общий ответ всегда один - форкать, наливать сверху свои изменения и затем портировать их регулярно на свежий релиз. Это самый затратный вариант, но он не требует ничего от библиотеки кроме открытости кода и подходящей лицензии, разрешающей вносить правки без неприемлемых для вас обязательств.
Ответ написан
Комментировать
@NIR-Ginko
Нужны подробности реализации. Если вы рассчитываете, что с вашей реализацией библиотеки должны работать и сторонние программы, то, как минимум, не надо ломать API при изменении функции.

Вариант реализации:
  • Сделать в функции два code path. Один - как был раньше. Другой - какой нужен. Переключение осуществлять по значению переменной окружения. Ещё один вариант - сделать переменную-переключатель. Это, конечно, неудачные варианты, но если программа работает в одном потоке то по принципу "и так сойдёт" - вполне будет работать.
  • Можно попробовать для своего случая подмену функции с помощью библиотеки, загружаемой через LD_PRELOAD. Тоже не самый лучший вариант, но можно рассмотреть.
  • Таки определить другую функцию и переписать кусочек программы. Оптимальный вариант.
Ответ написан
bullitufa
@bullitufa
электронщик программист (микроконтроллеры и PC)
1 вариант: если можете "всунуть" управление приёмом/передачей в "портовую" часть, то проще добавить свою папку порта с своими изменениями.
2 вариант: библиотеку в гит и свои изменения в отдельную ветку
3 вариант: 2 и 1 вариант если либмодбас например в гитхабе, то предложить пул реквест со своими изменениями
Ответ написан
Комментировать
@kriptonus Автор вопроса
Конкретно в моем случае не пришлось ничего переписывать. В библиотеке реализовано переключение направления передачи через CTS вывод.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы