А вот и решение:
Объявляем и реализуем в X символ вида x_version_marker_symbol_XXXXXXXXX (где XXXXX — ревизий, выставляет автоматически билд скриптом), и принудительно его использовать в A и B. Если версии не совпадут — то линкер будет искать x_version_marker_symbol_YYYYYYYYY и ругнется на undefined symbol.
Дано — приложение разбито на 3 статические либы — A, B и X. Либы A и B зависят от X, но не зависят между собой. X описывает интерфейс взаимодействия между A и B. Разработка каждой либы ведется в отдельном репозитории, репозиторий либы X включен как сабрепозиторий в репозитории либ A и B. Либы A и B разрабатываются разными командами, каждая команда имеет доступ к исходникам своей либы и либы X, а вторая либа доступна только в виде статической библиотеки без заголовочных файлов.
Задача — гарантировать что приложение не соберется если используются разные версии либы X. В идеале — получить ошибку линковки. Есть идеи как это можно сделать?