Компиляция простой программы DirectX из командной строки с использованием VS

Я безуспешно пытался скомпилировать простую программу DirectX из командной строки.

Я скачал примеры с https://github.com/microsoft/DirectX-Graphics-Samples открыл любой проект в VS, скомпилировал его и все заработало.

Теперь я хотел пойти немного проще и просто скомпилировать свою программу DirectX из командной строки без необходимости создавать проект VS.

Я написал следующую команду:

"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.39.33519/bin/Hostx64/x64/cl.exe" ^
    /I "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.39.33519/include" ^
    /I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0/um" /I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0/ucrt" /I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0/cppwinrt" /I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0/shared" /I "C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0/winrt" ^
    /I "C:\Users\spl1nes\.nuget\packages\microsoft.direct3d.d3d12\1.613.1\build\native\include" /I "C:\Users\spl1nes\.nuget\packages\microsoft.direct3d.d3d12\1.613.1\build\native\include\d3dx12" /I "C:\Users\spl1nes\.nuget\packages\microsoft.direct3d.d3d12\1.613.1\build\native" ^
    /nologo /W4 /ZI /Od /MDd /GS /EHsc /sdl^
    /D WIN32 /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE ^
    /Fo"build/" /Fe"build/main.exe" "src/main.cpp" /Fd"build/main.pdb" ^
    /link ^
    -incremental:no /SUBSYSTEM:windows^
    /LIBPATH:"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.39.33519/lib/x64" ^
    /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0/um/x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0/ucrt/x64" ^
    user32.lib kernel32.lib gdi32.lib winmm.lib d3d12.lib dxgi.lib d3dcompiler.lib dxguid.lib

Однако всякий раз, когда я пытаюсь скомпилировать код, я получаю следующую ПЕРВУЮ ошибку:

C:\Users\spl1nes\.nuget\packages\microsoft.direct3d.d3d12\1.613.1\build\native\include\d3dx12\d3dx12_property_format_table.h(29): error C3646: 'Layout': unknown override specifier

И еще много ошибок внутри drdx12_property_format_table.h, cstdlib,... Сами ошибки кажутся бессмысленными вот так:

C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include\cstdint(20): error C2059: syntax error: 'namespace'

Вот почему я считаю, что мне либо не хватает некоторых включений, либо библиотек, либо настроек пути VS.

Какой пример проекта вы создаете?

Minxin Yu - MSFT 05.04.2024 08:35

Я бы рекомендовал использовать систему сборки, такую ​​​​как CMake, чтобы исправить это. Если вы уже все настроили в проекте VS, настроить это в CMake не должно быть слишком сложно.

André Lehto 05.04.2024 08:42

@MinxinYu-MSFT В VS я попробовал почти все, и все сработало. Из cmd я сделал то же самое, но для простоты, скажем так HelloBundles

Dennis Eichhorn 05.04.2024 11:55

Я всегда заранее делаю что-то вроде if not defined DevEnvDir ( call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" ) для своих CMD сценариев сборки, а затем могу запустить cl без указания пути и нормально скомпилировать синтаксис MSVC++. Надеюсь, это поможет. Вот пример bat-скрипта, использующего его github.com/yosmo78/DirectX12-HandAnimLibOVR/blob/main/…

yosmo78 08.04.2024 04:30

@ yosmo78 Это помогло мне опустить некоторые включения «по умолчанию», поскольку эти пути установлены с помощью vcvars64 (очевидно). Однако я могу запустить ваш Compile.bat. Вы полагаетесь на d3dx12.h? Я обнаружил, что могу компилировать, пока не использую d3dx12.h, что, конечно, раздражает.

Dennis Eichhorn 08.04.2024 13:38

@DennisEichhorn Я использую и #include <d3d12.h>, и #include <dxgi1_4.h> (или 1_6, когда хочу использовать новые функции). Я также использую #include <dxgidebug.h> при отладке и #include <D3Dcompiler.h>, когда хочу компилировать шейдеры во время выполнения. Но я не использую d3dx12.h

yosmo78 09.04.2024 07:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
172
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте командную строку x64 для VS2022 вместо обычного CMD. Он запустит сценарий для настройки среды cl.

Возьмем, к примеру, D3D12Fullscreen.

  1. Откройте проект в Visual Studio: установите подавление баннера запуска: No в обоих

Свойства проекта -> C++ -> General и Linker -> General.

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

  1. очистите проект и создайте проект из командной строки.

Я удалил часть ненужной команды. Что вам нужно сделать, это заменить пути (в этом примере их два): XXX\Downloads\DirectX-Graphics-Samples\XXXX

cl  /I"XXX\Downloads\DirectX-Graphics-Samples-master\Samples\Desktop\D3D12Fullscreen\src\packages\WinPixEventRuntime.1.0.161208001\build\..\Include\WinPixEventRuntime" /ZI /JMC /W3 /WX- /diagnostics:column /sdl /Od /D WIN32 /D DEBUG /D   _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline  /Fo"obj\x64\Debug\\"  /external:W3 /Gd /TP /FC /errorReport:prompt D3D12Fullscreen.cpp DXSample.cpp Main.cpp Win32Application.cpp /link "/LIBPATH:XXX\Downloads\DirectX-Graphics-Samples-master\Samples\Desktop\D3D12Fullscreen\src\packages\WinPixEventRuntime.1.0.161208001\build\..\bin" WinPixEventRuntime.lib dxgi.lib d3d12.lib d3dcompiler.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Delayimp.lib   /DEBUG "/PDB:bin\x64\Debug\D3D12Fullscreen.pdb" /SUBSYSTEM:WINDOWS "/IMPLIB:bin\x64\Debug\D3D12Fullscreen.lib" /MACHINE:X64  "/OUT:bin\x64\Debug\D3D12Fullscreen.exe" 

После сборки не забудьте скопировать postShaders.hlsl, sceneShaders.hlsl, WinPixEventRuntime.dll в папку exe.

Обновлять:

cl  /I"XXX\Downloads\DirectX-Graphics-Samples-master\Samples\Desktop\D3D12HelloWorld\src\packages\Microsoft.Direct3D.D3D12.1.613.1\build\native\include" /I"XXX\Downloads\DirectX-Graphics-Samples-master\Samples\Desktop\D3D12HelloWorld\src\packages\Microsoft.Direct3D.D3D12.1.613.1\build\native\include\d3dx12" /I"XXX\Downloads\DirectX-Graphics-Samples-master\Samples\Desktop\D3D12HelloWorld\src\packages\Microsoft.Direct3D.D3D12.1.613.1\build\native\\" /ZI /JMC /W3 /WX- /diagnostics:column /sdl /Od /D WIN32 /D _DEBUG /D _WINDOWS /D _UNICODE /D UNICODE /Gm- /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Zc:inline  /Fo"obj\x64\Debug\\" /Fd"obj\x64\Debug\vc143.pdb" /external:W3 /Gd /TP /FC /errorReport:prompt Win32Application.cpp D3D12HelloBundles.cpp DXSample.cpp Main.cpp /link d3d12.lib dxgi.lib d3dcompiler.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib Delayimp.lib  /DEBUG "/PDB:bin\x64\Debug\D3D12HelloBundles.pdb" /SUBSYSTEM:WINDOWS  "/IMPLIB:bin\x64\Debug\D3D12HelloBundles.lib" /MACHINE:X64  "/OUT:bin\x64\Debug\D3D12HelloBundles.exe"

Я попробовал ваше обновление. Он не смог найти windows.h. Я добавил /I к включенным по умолчанию и вернулся к тем же ошибкам, начиная с d3dx12_property_format_table.h

Dennis Eichhorn 08.04.2024 13:25

Вы изменили пример кода? Пожалуйста, покажите полные ошибки. It couldn't find windows.h Использовали ли вы командную строку собственных инструментов x64 для VS?

Minxin Yu - MSFT 09.04.2024 03:57
Ответ принят как подходящий

Хорошо, после некоторого тестирования я наконец решил эту проблему.

Это была проблема с версией Windows Kit. Я обновился до 10.0.26100.0 и всё заработало.

Например, структура D3D_FORMAT_LAYOUT не определена в 22000.0. Однако сообщение компилятора немного сбивало с толку.

Другие вопросы по теме

Похожие вопросы

Вычтите беззнаковые целые числа в длинный результат со знаком. Никогда не отрицательный?
Назначаемая функция в C++
Выражение: индекс вектора выходит за пределы допустимого диапазона для системы повышения ранжирования
Перегрузка операторов с помощью дженериков, несколько абстрактных классов С++
Что такое noptr-declarator в объявлении массива C++?
Создание собственного всплывающего окна, которое меняет высоту в зависимости от содержимого и при необходимости добавляет полосу прокрутки
Как создать абстрактный класс внутри родительского класса, чтобы каждый дочерний класс мог иметь собственную реализацию?
Есть ли вероятность того, что упрощенные формы определенных математических выражений вызовут ошибки переполнения, а сложные — нет?
Как написать функцию C++, которая удаляет указатель вместо макроса
Как нарисовать наложение в C++?