Подтвердить что ты не робот

Отслеживание общих API API С++ lib

В настоящее время я работаю над крупным проектом на основе С++ Qt, который вскоре станет основным ре-фактором его публичного API, и было бы неплохо иметь инструмент, который может генерировать отчет о том, какие методы были добавлены или удалены из сборки для сборки.

Я знаю, что для Java есть инструмент для этого, и я думаю, что может быть один для .NET, но после небольшого поиска я не смог найти что-нибудь для С++.

Есть ли один. Кросс-платформу было бы неплохо, или, если бы в Linux тоже было бы хорошо.

4b9b3361

Ответ 1

Если вы используете Doxygen или какой-либо аналогичный инструмент для документирования вашего API, вы можете diff таблицу содержимого.

  • Это то, что вы должны делать в любом случае.
    • (Вы также можете сказать Doxygen, чтобы найти недокументированные функции.)
  • Вы можете легко применить его к древним экзаменам, ничего не меняя.
  • Doxygen и его знакомые знают, что язык чувствителен к private и public.
  • Это решение может применяться ко многим языкам и не зависит от конкретной среды разработки.
  • Не требуется стороннее программное обеспечение (учитывая, что у вас уже есть генератор документации).

Ответ 2

Проверьте нижнюю часть коммерческого списка на apidiff, я думаю, что это будет самое близкое совпадение.

Предложение использования "nm" не плохое, вы можете запустить

nm <binary_or_lib> | c++filt

И он создаст приличный снимок, который потребует значительного количества последующей обработки.

Здесь можно найти несколько способов катить:

  • Doxygen может генерировать XML файл, который имеет всю информацию о классе/члене/методе, которую вы могли бы использовать для создания деревьев классов. Тогда это будет вопрос сравнения деревьев. Некоторые полезные сценарии/утилиты для последующей обработки можно найти @http://www.stack.nl/~dimitri/doxygen/helpers.html

  • Если вы компилируете с помощью gcc, egypt - это новый подход, в котором используется промежуточный RTL для создания графиков зависимостей вызовов - похоже, было бы не так сложно использовать подобный метод для генерации базовой информации API.

  • GCC-XML будет генерировать XML-представления скомпилированного кода, немного более низкого уровня, чем Doxygen, поскольку он обеспечивает механизм для запись кода обложки.

  • cppHeaderParser, модуль python будет генерировать прекрасные представления объектов python заголовков, предоставляя простой способ создания карт API.

  • ctags создает базу данных тегов, которая, вероятно, может быть обработана. Однако у него проблемы с пространствами имен С++.

Некоторые коммерческие решения

  • scitool Понять делает отличную работу по отображению программного обеспечения и имеет API perl для запроса своей базы данных.

    /li >
  • MagicDraw - это инструмент с тяжелым весом, ориентированный вокруг UML, но он может реконструировать существующий код на С++ -база и генерировать метаинформацию.

  • apidiff кажется довольно доступным инструментом и с учетом критериев (кросс-платформенный, С++), скорее всего, strong > ближайший.

Ответ 3

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

В Windows вы используете файл .DEF для экспорта символов из DLL.

В Unix-like вы используете компоновщик script, чтобы сделать это.

Ответ 4

Добавьте шаг автоматической сборки, который использует nm для Unix-подобных и любого инструмента Windows (dumpbin?), чтобы сбрасывать список экспортируемых функций. Используйте некоторый язык сценариев, чтобы отключить несущественные биты, которые меняются от сборки к сборке, например, адреса.

После каждой сборки зафиксируйте этот файл для контроля версий. Затем вы можете увидеть отличия от каждой сборки.

Поскольку это приложение С++, имена также будут отслеживать изменения типа параметра.

Ответ 5

Попробуйте abi-compliance-checker. Этот инструмент показывает добавленные/удаленные символы в вашем API, изменения в параметрах/типах данных и другие изменения с точки зрения совместимости двоичных файлов. Это кросс-платформенный. Лучшая производительность - на Linux, но она также может работать на Windows и Mac.

Использование:

abi-compliance-checker -lib NAME -old OLD.abidump -new NEW.abidump

*. Файлы abidump представляют собой сбросы ABI, сгенерированные инструментом abi-dumper.

Эта таблица совместимости для библиотеки Qt создается с помощью этого инструмента:

введите описание изображения здесь

Не стесняйтесь задавать любые вопросы использования в комментариях ниже.

Ответ 6

Если вы используете git, вы должны создать новую ветку и использовать оболочку script для сравнения всех файлов заголовков, которые определяют API между ветвями. Если вы еще этого не сделали, вы должны использовать шаблон impl для ваших файлов заголовков API, чтобы сделать бинарную совместимость библиотеки более стабильной для будущих версий. См. Запись для d_pointer в викторике разработчиков Qt или в части D-Pointers в технической базе KDE.

Ответ 7

В дополнение к варианту использования Doxygen для свертывания собственного инструмента анализа я бы также предложил изучить использование BSC Toolkit. Это позволяет вам получить доступ к информации обозревателя кода/класса, сгенерированной компиляторами MS, и предоставляется бесплатно. Инструментарий обеспечивает программный доступ ко всем определениям, ссылкам на использование, номерам источников и строк, параметрам, модификаторам доступа и т.д. Имена указаны в их искаженной форме, и средства включены для перевода их в читаемый человеку формат, если это необходимо.

Вот несколько основных результатов проекта, над которым я работаю:

IXConnection (struct_name)
IXConnection::STATE (enum_name)
IXConnection::setState(enum STATE) (mem_func public)
IXConnection::setAccount(struct IXAccount *) (mem_func public)
IXConnection::setDisplayName(class String *) (mem_func public)
IXConnection::setProtocolData(void *) (mem_func public)
IXConnection::getState(enum STATE *) (mem_func public)
IXConnection::getAccount(struct IXAccount * *) (mem_func public)
IXConnection::getProtocol(struct IXProtocol * *) (mem_func public)
IXConnection::getPassword(class String * *) (mem_func public)
IXConnection::getDisplayName(class String * *) (mem_func public)
IXConnection::getProtocolData(void * *) (mem_func public)
IXConnection::setProgress(class String *,int,int) (mem_func public)
IXConnection::notice(class String *) (mem_func public)
IXConnection::error(enum REASON,class String *) (mem_func public)