Я безуспешно пытался скомпилировать простую программу 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.
Я бы рекомендовал использовать систему сборки, такую как CMake, чтобы исправить это. Если вы уже все настроили в проекте VS, настроить это в CMake не должно быть слишком сложно.
@MinxinYu-MSFT В VS я попробовал почти все, и все сработало. Из cmd я сделал то же самое, но для простоты, скажем так HelloBundles
Я всегда заранее делаю что-то вроде 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 Это помогло мне опустить некоторые включения «по умолчанию», поскольку эти пути установлены с помощью vcvars64 (очевидно). Однако я могу запустить ваш Compile.bat. Вы полагаетесь на d3dx12.h? Я обнаружил, что могу компилировать, пока не использую d3dx12.h, что, конечно, раздражает.
@DennisEichhorn Я использую и #include <d3d12.h>, и #include <dxgi1_4.h> (или 1_6, когда хочу использовать новые функции). Я также использую #include <dxgidebug.h> при отладке и #include <D3Dcompiler.h>, когда хочу компилировать шейдеры во время выполнения. Но я не использую d3dx12.h





Используйте командную строку x64 для VS2022 вместо обычного CMD. Он запустит сценарий для настройки среды cl.
Возьмем, к примеру, D3D12Fullscreen.
No в обоихСвойства проекта -> C++ -> General и
Linker -> General.
Затем создайте проект так, чтобы вы могли видеть команду сборки в Visual Studio, и скопируйте ее в блокнот.
Я удалил часть ненужной команды. Что вам нужно сделать, это заменить пути (в этом примере их два): 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
Вы изменили пример кода? Пожалуйста, покажите полные ошибки. It couldn't find windows.h Использовали ли вы командную строку собственных инструментов x64 для VS?
Хорошо, после некоторого тестирования я наконец решил эту проблему.
Это была проблема с версией Windows Kit. Я обновился до 10.0.26100.0 и всё заработало.
Например, структура D3D_FORMAT_LAYOUT не определена в 22000.0. Однако сообщение компилятора немного сбивало с толку.
Какой пример проекта вы создаете?