Это не вопрос, а, скорее комментарии по поводу уже решенной задачи. Может кому-то будет интересно, а может кто-то что-то свое добавит для расширения понимания.
У нас проект с множеством статических библиотек, которые пишут разные люди. Так же есть система версионирования с минорными и мажорными версиями.
Какова идея? Если мы меняем реализацию, но интерфейс остается прежний или его изменения не ведут к бинарной несовместимости — минорная версия. т.е. старую либу можно не пересобирать.
Мажорное изменение — изменение в интерфейсе и сама система сборки заставит пересобрать либу с более новой.
Примерная структура проекта:
Либа_Б — собрана с Либа_А_1_2
Либа_В — собрана с Либа_А_1_3
Линкуем:
Либа_А_1_3
Либа_Б
Либа_В
Ожидается, что обе либы подхватят новую либу А_1_3
Все успешно линкуется. среда — vs2005
Далее натыкаемся на странный баг при долгой отладке которого оказывается, что причина — бинарная несовместимость. И только в дебажной сборке.
Причем в либе В.
Загадки линковки, которые привели к багу:
В либе А есть класс, объявленный полностью в хедере.
При сборке Либа_Б забирает себе этот класс. Из старой либы.
При сборке Либа_В так же забирает себе этот класс. Из новой либы.
При линковке линкер натыкается на две реализации класса, не выдает ни малейшего ворнинга и берет класс из либы Б для либы В!
Далее мы получаем Либу_В с классом из либы, которая не участвует в сборке вообще!
Баг состоял в том, что программист добавил виртуальный метод перед уже существующим виртуальным методом.
Либа запомнила индекс метода, но не его имя. И при вызове вызывался совершенно иной метод, который не приводил к падению программы,
т.к. имел идентичную сигнатуру. Позже приводил к странному поведению программы. т.к. это класс хелпер для строк — не сразу стало понятно, в чем дело.
Программист, конечно, должен был добавлять виртуальный метод в конец или изменить мажорную версию. В этом случае была бы ошибка компиляции и либу Б пришлось бы пересобирать с новой либой А.
Но благодаря ему мы узнали такое вот странное поведение линковщика. Хорошо хоть только в дебаге.