Как разбить проект CMake на подпроекты
Разделяем на подпроекты существующий проект C++ на CMake
Интегрированные среды разработки вроде QtCreator стремятся обеспечить программиста всем необходимым, чтобы он как можно реже выходил из среды. Да, удобно работать с универсальным инструментом. Но все потребности покрыть невозможно. В этой статье рассмотрим как запускать сторонние программы из QtCreator на примере анализатора утечек памяти DrMemory.
Для запуска DrMemory предлагаю добавить в проект QtCreator новую конфигурацию запуска. При открытом проекте переходим на вкладку настроек проекта (1), открываем страницу с конфигурациями запуска (2) и запускаем создание новой конфигурации (3). В открывшемся окне выбираем пункт “Custom Executable” (4), который не соответствует ни одной из целей сборки, и жмем “Create” (5).
Созданную конфигурацию рекомендую переименовать во что-то более осмысленное, чем имя по умолчанию. Например, в “DrMemoryRunner”.
Теперь заполняем параметры конфигурации запуска. В поле “Executable:” (1) указываем полный путь к исполняемому файлу программы drmemory.exe. В аргументах командной строки (2) указываем команду для запуска анализатора: -- %{buildDir}/bin/tst_Common.exe
. Здесь %{buildDir}
- это переменная QtCreator, содержащая путь к сборочной директории проекта, а tst_Common.exe
- целевая программа, которую мы хотим анализировать. В качестве рабочей директории (3) рекомендую указать папку с исполняемым файлом: так бывает проще найти выходные данные. Но в общем случае это не принципиально.
На этом этапе можно считать конфигурацию готовой. Остается разобраться с некоторыми особенностями. В случае с особой конфигурацией запуска QtCreator не добавляет в переменную окружения Path пути к необходимым для запуска библиотекам. Среда просто не знает, какие нужно добавлять. Поэтому если указанное в конфигурации приложение не запускается, придется самостоятельно прописать пути к библиотекам в Path (4).
Для добавления директории в переменную Path разворачиваем шторку “Details” (1) блока переменных окружения “Environment”. Там находим строку Path (2) и добавляем в нее нужные пути через “Append path…” (3).
Для переключения QtCreator на созданную конфигурацию запуска открываем панель выбора конфигураций (1) и для текущей конфигурации сборки (2) выбираем только что созданную конфигурацию запуска анализатора (3).
При запуске анализатора (1) весь его консольный вывод (2) попадет на вкладку терминала “Terminal” (3). В самом конце вывода мы увидим, были ли обнаружены утечки памяти. Например, на скрине ниже обнаружена 1 утечка на 4 байта (2).
Подробности по каждой конкретной утечке памяти выводятся немного раньше. Нужно прокрутить вывод анализатора вверх и найти блок с заголовком “ERROR #..: LEAK …” (1). Этот блок содержит стек вызовов, в котором была обнаружена данная утечка. По стеку находим проблемную строку нашего кода, в которой была выделена “потёкшая” память (2). Для каждой обнаруженной утечки выводится свой блок со стеком.
Остается еще одна проблема, которая доставляет неудобства, - DrMemory после окончания работы автоматически открывает Блокнот с результатами анализа. Это лишнее, так как информация в Блокноте дублирует вывод в QtCreator. Отключить запуск Блокнота можно ключом --batch
.
Таким образом анализатор DrMemory может использоваться напрямую из среды QtCreator. Аналогично можно настроить запуск любого инструмента.
Разделяем на подпроекты существующий проект C++ на CMake
Учимся создавать свое первое оконное приложение на Qt с использованием QMainWindow в среде QtCreator
Учимся создавать свою первую 3D модель тора в OpenCASCADE
Учимся работать с пул-реквестами на GitHub в личных репозиториях
Простейший пример исследования и патчинга исполняемого файла с помощью Cutter