Разное

Запуск midl компилятор: Использование компилятора MIDL — Win32 apps

Unreal Engine — компиляция всех Blueprints в проекте. Как, а главное — зачем — Gamedev на DTF

{«id»:4032,»url»:»\/distributions\/4032\/click?bit=1&hash=bfb4ed77110d2d8f20afbffb94de97857d57f9ae6c79f43112b7a42480755f2f»,»title»:»\u0412 \u00ab\u0410\u043a\u0430\u0434\u0435\u043c\u0438\u0438 \u0441\u0442\u0430\u0440\u0442\u0430\u043f\u043e\u0432\u00bb \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443\u0442 \u043a\u0430\u043a \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u044b\u0440\u0443\u0447\u043a\u0443″,»buttonText»:»»,»imageUuid»:»»,»isPaidAndBannersEnabled»:false}

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

3777 просмотров

Ошибки/предупреждения времени компиляции могут возникать не только во время непосредственной работы с blueprint, но и в результате внешних изменений, таких как:

  • Изменение типа/спецификаторов доступа/метаинформации переменной/метода;
  • Изменение сигнатуры метода;
  • Удаление переменной/метода;
  • Удаление файлов, на которые ссылается blueprint;
  • И многое, многое другое.

Иногда в качестве внешнего фактора выступают творческие коллеги https://blueprintsfromhell.tumblr.com/image/182038609701

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

К счастью для нас, инженеры Epic снабдили свой движок полезным инструментом, который позволяет проверить все blueprints проекта на наличие ошибок/предупреждений.

CompileAllBlueprints

Дисклеймер:
Я буду указывать полные пути до файлов так, как они расположены у меня в системе.
Не забывайте менять на подходящие в вашем случае. 🙂

Для запуска понадобятся:

1. UE4Editor-Cmd.exe, найти можно по адресу

C:\Program Files\Epic Games\UE_4.26\Engine\Binaries\Win64\UE4Editor-Cmd.exe

2.. uproject файл проекта, лежит в корне, в моем случае

C:\Games\UnrealProjects\Nice\Nice.uproject

3. Терминал/командная строка/текстовый редактор — в зависимости от того, как вы будете запускать проверку.

Способ 1 — запуск из командной строки

Здесь все просто — открываем любимый терминал и вызываем

«C:\Program Files\Epic Games\UE_4.26\Engine\Binaries\Win64\UE4Editor-Cmd.exe» «C:\Games\UnrealProjects\Nice\Nice.uproject» -run=CompileAllBlueprints -ShowResultsOnly

По экрану поползут логи компиляции. В зависимости от размера проекта процесс может занимать от десятка секунд до нескольких минут.

Если все хорошо, ближе к концу простыни лога появится воодушевляющее сообщение

[2021.12.21-16.16.11:221][ 0]LogCompileAllBlueprintsCommandlet: Display: =================================================================================== Compiling Completed with 0 errors and 0 warnings and 0 blueprints that failed to load. ===================================================================================

В противном случае программа подскажет не только файлы с ошибками, но и сами ошибки (в данном случае я создал bool переменную, использовал ее в branch ноде, после чего переменную удалил из variables, но оставил в редакторе):

[2021. 12.21-16.16.47:187][ 0]LogCompileAllBlueprintsCommandlet: Display: =================================================================================== Compiling Completed with 1 errors and 0 warnings and 0 blueprints that failed to load. =================================================================================== [2021.12.21-16.16.47:189][ 0]LogInit: Display: [2021.12.21-16.16.47:190][ 0]LogInit: Display: Warning/Error Summary (Unique only) [2021.12.21-16.16.47:190][ 0]LogInit: Display: ———————————— [2021.12.21-16.16.47:190][ 0]LogInit: Display: LogBlueprint: Error: [AssetLog] C:\Games\UnrealProjects\Nice\Content\Blueprints\StatusEffects\BP_NiceStatusEffect_Strength.uasset: [Compiler] In use pin Test Bool no longer exists on node Get . Please refresh node or break links to remove pin. from Source: /Game/Blueprints/StatusEffects/BP_NiceStatusEffect_Strength.BP_NiceStatusEffect_Strength

Способ 2 —. bat

Каждый раз запускать консоль, вспоминать/вводить/копировать длинные пути до нужных файлов — то еще удовольствие. Намного проще один раз задать все в скрипте и запускать проверку двойным кликом по файлу.

Поэтому в корне проекта я создал compileBP.bat с таким содержанием (на самом деле не совсем, но это детали):

@echo off set UE4EDITORCMD_EXE=C:\Program Files\Epic Games\UE_4.26\Engine\Binaries\Win64\UE4Editor-Cmd.exe set UPROJECT_PATH=C:\Games\UnrealProjects\Nice\Nice.uproject call «%UE4EDITORCMD_EXE%» «%UPROJECT_PATH%» -run=CompileAllBlueprints -ShowResultsOnly pause

Его запуск открывает окно cmd.exe с логами. После завершения проверки окно любезно подождет пользовательского ввода.

Способ 3 — парсинг файла логов

Можно заметить, что полезной информации в логах едва наберется на 5 строчек, так зачем любоваться на все остальное, когда машина может отфильтровать нужное?

Для удобства и облегчения автоматизации процесса можно задать имя файла, в который будет сохраняться лог исполнения. Для этого достаточно к основной команде добавить аргумент -log=BPCompileLog. txt (имя файла можете заменить по вкусу).

@echo off set UE4EDITORCMD_EXE=C:\Program Files\Epic Games\UE_4.26\Engine\Binaries\Win64\UE4Editor-Cmd.exe set UPROJECT_PATH=C:\Games\UnrealProjects\Nice\Nice.uproject call «%UE4EDITORCMD_EXE%» «%UPROJECT_PATH%» -run=CompileAllBlueprints -ShowResultsOnly -log=BPCompileLog.txt

А дальше все зависит только от вашей фантазии. Для рабочего проекта я остановился на следующей последовательности:

  1. Каждый коммит, затрагивающий код, запускает проверку на тестовой машине;
  2. В случае обнаружения ошибок собирается информация о файлах с дефектами, а также коммитах (номер, пользователь и комментарий), совершенных с момента предыдущей проверки;
  3. Информация отправляется в Slack с человекочитаемым форматированием;
  4. Если ошибок не найдено, но предыдущая проверка закончилась неудачей, отправляется сообщение о том, что ошибки были исправлены.

Такие дела.

Буду рад ответить на вопросы и обсудить трудности автоматизации в геймдеве. 🙂

Онлайн компилятор: подборка лучших компиляторов для C++, PHP, Python

Не всегда есть доступ к любимой IDE или время на ее запуск. Но когда нужно быстро проверить какой-то простой функционал или воплотить новую идею, пригодится онлайн-компилятор.

Онлайн-компиляторы — инструменты для преобразования кода программиста в машинный, понятный для компьютера. В данном случае речь идет, в том числе, и о написании и выполнении программы. Обычно для этого используют IDE-интегрированную среду разработки, специальные приложения. Обычно IDE очень комплексные и требуют много памяти. Впрочем, для некоторых задач есть возможность сохранить время и ресурсы и справиться с помощью браузера. C++, PHP, Python, Java, C#, Go — можно найти решения как для популярных языков, так и для более нишевых.

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

Содержание

Многоязычные компиляторы

Online IDE

Среди преимуществ этого редактора — предложения. Стоит ввести одну букву, и вам будут доступны варианты автодополнения, что поможет сохранить время. Компилятор поддерживает работу с несколькими файлами, позволяет их импортировать с компьютера. Кроме того, созданный код можно загружать или делиться им онлайн, сохраняя в облаке. Удобная работа с терминалом — его содержимое тоже можно очищать, копировать или отправлять, доступна функция аргументов командной строки. Еще из приятностей — редактор поддерживает темный режим и не нуждается в регистрации.

IDEONE

Характерная черта — в отличие от многих других компиляторов этот поддерживает не только самые популярные языки, но и ассемблер, Фортран и тому подобное. Здесь есть три уровня доступа к коду — публичный (он будет отображаться на отдельной странице), секретный (доступен только по ссылке), частный (сможете просматривать только вы при условии регистрации). IDEONE имеет еще некоторые ограничения для незарегистрированных пользователей — время выполнения программы. При наличии аккаунта он составляет 15 секунд, без — 5.

Repl.it

Этот сервис дает достаточно много возможностей, он максимально приближен к десктопной IDE. Во-первых, здесь можно создавать целостную структуру проекта, разделяя код не только по разным файлам, но и по директориям. Разрешено использовать систему контроля версий, подключить имеющийся репозиторий с GitHub или создать новый. Можно воспользоваться дебагером, устанавливать переменные среды, подсоединить базу данных, пригласить людей для совместной работы. Здесь также отображаются предложения, пока вы пишете. И все это — бесплатно. В платной версии доступно неограниченное количество частных репозиториев, большая скорость и объем памяти.

CodingGround

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

OneCompiler

Эта платформа позволяет работу с 40 языками программирования, а также с фронтендовими фреймворками и различными диалектами SQL. Для каждого варианта подают небольшой туториал с базовыми понятиями. Компилятор поддерживает ввод для программы. Из интересных возможностей вне собственно запуска кода, для зарегистрированных пользователей есть большой сборник задач по программированию разного уровня сложности.

GeeksForGeeks

Опять учебный ресурс с платными и бесплатными материалами. Компилятор относится ко второй категории. Доступны несколько популярных языков, можно загружать файлы с компьютера, добавлять входные данные. Редактор предлагает автодополнение, имеет систему комбинаций клавиш для различных операций. В общем — все, чтобы запустить код быстро и просто, даже с мобильного устройства.

W3Schools

Это еще одна известная платформа с курсами, туториалами, упражнениями и тестами. Онлайн-компиляторы предлагают для тех языков, которые можно изучать на сайте — PHP, Java, C++, C#, R, Python, JavaScript, Go и другие. Также есть редакторы для работы с HTML, CSS, SQL и тому подобное. Ресурс имеет простой минималистичный интерфейс, без продвинутых функций.

Компилятор для C, C++

OnlineGDB

Компилятор поддерживает несколько языков, но в первую очередь предназначен для C и C++. Среди характеристик — возможность работы с многочисленными файлами, наличие дебаггера. Интересная функция «beautify», автоматически форматирующая код, в частности отступы в нем, в соответствии со стандартами. 

Компилятор для работы с C#

DotNetFiddle

Этот онлайн компилятор C# поддерживает еще F# и VB.NET. Он позволяет делиться кодом, как для просмотра, так и для совместной работы. Также есть различные режимы работы — для консольного приложения, скрипта, по шаблону MVC и с фреймворком Nancy. А еще имеется опция «tidy up» — если ручная расстановка отступов отнимает много времени.

Компилятор для web-разработки

CodeSandbox

На этой платформе можно работать с HTML и многочисленными JavaScript библиотеками и фреймворками — React, Vue.js, Node.js и многими другими технологиями. Поддерживается создание иерархической структуры проекта, можно подсоединить профиль GitHub. А еще — развернуть разработанное приложение на одном из предложенных сервисов. Среди возможных недостатков — вся ваша работа будет в публичном доступе. Частные проекты можно разрабатывать в платной версии.

Компилятор для Go

The Go Playground

Это компилятор от официального сайта Go. Возможности довольно ограничены, есть лишь пространство для работы с кодом и консоль для вывода. Поэтому если нужно быстро проверить небольшой участок кода, сервис справится, а для более широкого функционала можно воспользоваться Repl.it, Online IDE, Online GDB или иной площадкой, что поддерживает Go.

Компилятор для Java

JDoodle

Здесь можно выбирать версию языка, задавать аргументы командной строки, добавлять ввод. Также есть возможность совместной работы над кодом, который можно использовать для проведения интервью. Сервис поддерживает более 70 языков, однако особенно он полезен для разработки на Java. Например, именно для нее есть два типа компилятора — базовый, когда нужно быстро выполнить несколько строк кода, и продвинутый — для структуры из многочисленных файлов, работы с чтением и записью к документам

Компиляция IDL-файлов (MIDL, MyComInterface.idl)

Урок 8 MIDL: Компиляция IDL-файлов ComInterface.idl.

В предыдущем уроке вы познакомились с IDL. Мы определили IMyComInterface и IYourComInterface , используя IDL. Этот урок основан на этой работе.

МИДЛ

После завершения спецификации с использованием IDL мы компилируем ее с использованием MIDL. MIDL — это инструмент командной строки, поставляемый с Visual C++. MIDL вызывает компилятор командной строки Visual C++ (cl). Прежде чем вы сможете использовать MIDL, вам необходимо установить соответствующие переменные среды. Файл vcvars32.bat в каталоге DevStudio\Vc\Bin устанавливает соответствующие переменные среды. Упражнение ниже проведет вас через эти шаги.

Что делает компиляция

После успешной компиляции создается несколько файлов. Для IMyComInterface.idl это dlldata.c, IMyComInterface_p.c, IMyComInterface.h и IMyComInterface_i.c. На данный момент нам не нужны dlldata.c и IMyComInterface_p.c. IMyComInterface.h содержит определения структур C++ и C для реализации IMyComInterface

и IYourComInterface . В этих определениях используется несколько макросов, определенных в различных файлах включения, включенных как часть среды Visual C++. Большая часть кода в IMyComInterface.h предназначена для поддержки COM-программирования на основе C. Поскольку мы используем C++, мы можем игнорировать этот код. Ниже приведен фрагмент кода из IMyComInterface.h, который определяет IMyComInterface и IYourComInterface :

 интерфейс DECLSPEC_UUID
  ("673B0E01-4987-11d2-85C0-08001700C57F")
  IMyComInterface: общедоступный IUnknown
  {
   публичный:
     виртуальный HRESULT STDMETHODCALLTYPE Fx1
    (беззнаковый символ __RPC_FAR *buf) = 0;
        
     виртуальный HRESULT STDMETHODCALLTYPE Fx2
    (пусто) = 0;
  };
…
интерфейс DECLSPEC_UUID
  ("24A4A631-4B59-11d2-85C2-08001700C57F")
  IYourComInterface: общедоступный IUnknown
  {
   публичный:
     виртуальный HRESULT STDMETHODCALLTYPE Zx1
    (ДЛИННОЕ ix) = 0;
  };
 

Если интересно, вы можете просмотреть эти макросы, начиная с файла objbase.h, в каталоге include Visual C++ или с помощью Microsoft Platform SDK. Файл IMyComInterface_i.c определяет значение IID_IMyComInterface и IID_IYourComInterface .
Вот IID:
 константный IID IID_IMyComInterface =
 {0x673B0E01, 0x4987,0x11d2,
 {0x85,0xC0,0x08,0x00,0x17,
 0x00,0xC5,0x7F}};
константный IID IID_IYourComInterface =
 {0x24A4A631, 0x4B59,0x11d2,
 {0x85,0xC2,0x08,0x00,0x17,
 0x00,0xC5,0x7F}};
 

Файлы, сгенерированные MIDL, включают файл определения интерфейса, сгенерированный MIDL.

Внутри файлов, созданных MIDL

Как обсуждалось выше, определения интерфейса, сгенерированные MIDL, используют набор макросов, определенных в стандартном включаемом файле objbase.h. Ниже приведены определения обоих интерфейсов после предварительной обработки C++:

.
 структура __declspec(uuid
 ("673B0E01-4987-11d2-85C0-08001700C57F"))
  
   IMyComInterface: общедоступный IUnknown
   {
   публичный:
       виртуальный HRESULT __stdcall Fx1
   (беззнаковый символ *buf) = 0;
       
       виртуальный HRESULT __stdcall Fx2(void) = 0;
       
   };
…
структура __declspec(uuid
 ("24А4А631-4Б59-11d2-85C2-08001700C57F"))
 
   IYourComInterface: общедоступный IUnknown
   {
   публичный:
       виртуальный HRESULT __stdcall Zx1
   (ДЛИННОЕ ix) = 0;
   };
 

Обратите внимание, как эти определения похожи на закодированную вручную версию, которую мы сделали в предыдущем уроке. Также помните, что в C++, за некоторыми исключениями, struct и класс могут использоваться взаимозаменяемо. Директива _declspec(uuid(…)) используется Visual C++ для связывания IID с типом структуры. Одно из отличий этой версии от той, которую мы делали ранее, заключается в том, что эти функции-члены интерфейса определены как чисто виртуальные.
Это означает, что мы не можем напрямую создать экземпляр класса/структуры этого типа. Вместо этого мы получаем класс из IMyComInterface и IYourComInterface . Пока не беспокойтесь об этом. Наша цель в этой главе — изучить IDL, а не создавать COM-интерфейс.

midl com — Упражнение

Щелкните ссылку Упражнение ниже, чтобы настроить переменные среды для MIDL и скомпилировать IMyComInterface.idl.
средний ком — упражнение


c++ — вызвать компилятор MIDL из CMAKE

спросил

Изменено 3 года, 3 месяца назад

Просмотрено 3к раз

Я собираюсь использовать компилятор MIDL с CMAKE, но не могу вызвать компилятор MIDL из CmakeList

Это команда, которую я использую для достижения своей цели

 add_custom_command(
ВЫВОД ${CMAKE_CURRENT_BINARY_DIR}/IFace. h ${CMAKE_CURRENT_BINARY_DIR}/GUIDS.c ${CMAKE_CURRENT_BINARY_DIR}/Proxy.c ${CMAKE_CURRENT_BINARY_DIR}/ProxyDll.c
КОМАНДА midl /h IFace.h /iid GUIDS.c /proxy Proxy.c /dlldata ProxyDll.c ${CMAKE_CURRENT_LIST_DIR}/include/Server.idl
)
 

Когда я создаю свой проект, нет файлов, созданных компилятором MIDL в ${CMAKE_CURRENT_BINARY_DIR}

Но с этой подписью файлы хорошо генерируются

 add_custom_command(
PRE_BUILD
ЦЕЛЬ ${PROJECT_NAME}
КОМАНДА midl /h IFace.h /iid GUIDS.c /proxy Proxy.c /dlldata ProxyDll.c ${CMAKE_CURRENT_LIST_DIR}/include/Server.idl
)
 

Что я делаю не так?

  • c++
  • cmake
  • средний

2

Вот как это работает:

 set(MIDL_OUTPUT
    ${CMAKE_CURRENT_BINARY_DIR}/IFace.h
    ${CMAKE_CURRENT_BINARY_DIR}/GUIDS.c
    ${CMAKE_CURRENT_BINARY_DIR}/Proxy.c
    ${CMAKE_CURRENT_BINARY_DIR}/ProxyDll.c
    )
установить (MIDL_FILE
    ${CMAKE_CURRENT_LIST_DIR}/include/Server. idl
    )
add_custom_command(
    ВЫВОД ${MIDL_OUTPUT}
    КОМАНДА midl /h IFace.h /iid GUIDS.c /proxy Proxy.c /dlldata ProxyDll.c ${MIDL_FILE}
    РАБОЧИЙ_КАТАЛОГ ${CMAKE_CURRENT_BINARY_DIR}
    ЗАВИСИТ ${MIDL_FILE}
    ДОСТУПНО
    )
add_custom_target (средний cmplr
    ЗАВИСИТ ${MIDL_OUTPUT}
    )
add_dependencies(${PROJECT_NAME}
    средний cmplr
    )
set_source_files_properties(
    ${MIDL_OUTPUT}
        ХАРАКТЕРИСТИКИ
            СОЗДАН ИСТИНА
            )
 

2

, чтобы улучшить ответ @definename и комментарий @nathan-moinvaziri, нет необходимости делать add_custom_target , пока вы добавляете вывод в список исходных файлов, поэтому пересмотренный ответ:

 set(MIDL_OUTPUT
 ${CMAKE_CURRENT_BINARY_DIR}/IFace.h
 ${CMAKE_CURRENT_BINARY_DIR}/GUIDS.c
 ${CMAKE_CURRENT_BINARY_DIR}/Proxy.c
 ${CMAKE_CURRENT_BINARY_DIR}/ProxyDll.c
)
установить (MIDL_FILE
 ${CMAKE_CURRENT_LIST_DIR}/BookSku.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *