Я пытался заставить Visual Studio Code распознавать компилятор MSV C cl.exe и собирать его с помощью лучшей части дня. Я пробовал два разных метода (сам его настраиваю и использую надстройку VSCode под названием Easy C ++ для генерации кода) для его запуска и запуска, и оба не сработали одинаково, что вызвало у меня подозрения, что точка отказа может быть где-то вне моего контроля.
#include <Windows.h>
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
//register windows class
const auto pClassName = "Test";
WNDCLASSEX wc = {0};
wc.cbSize = sizeof(wc);
wc.style = CS_OWNDC;
wc.lpfnWndProc = DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = nullptr;
wc.hCursor = nullptr;
wc.hbrBackground = nullptr;
wc.lpszMenuName = nullptr;
wc.lpszClassName = pClassName;
wc.hIconSm = nullptr;
RegisterClassEx(&wc);
HWND hWnd = CreateWindowEx(
0, pClassName,
pClassName,
WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
200, 200, 640, 480,
nullptr, nullptr, hInstance, nullptr
);
ShowWindow(hWnd, SW_SHOW);
while(true);
return 0;
}
Это главное. cpp. В проекте нет других исходных или заголовочных файлов.
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.4.3
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28315 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
/std:c++latest is provided as a preview of language features from the latest C++
working draft, and we're eager to hear about bugs and suggestions for improvements.
However, note that these features are provided as-is without support, and subject
to changes or removal as the working draft evolves. See
https://go.microsoft.com/fwlink/?linkid=2045807 for details.
main.cpp
Microsoft (R) Incremental Linker Version 14.24.28315.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:main.exe
/debug
/OUT:bin\main.exe
main.obj
main.obj : error LNK2019: unresolved external symbol __imp_DefWindowProcA referenced in function WinMain
main.obj : error LNK2019: unresolved external symbol __imp_RegisterClassExA referenced in function WinMain
main.obj : error LNK2019: unresolved external symbol __imp_CreateWindowExA referenced in function WinMain
main.obj : error LNK2019: unresolved external symbol __imp_ShowWindow referenced in function WinMain
bin\main.exe : fatal error LNK1120: 4 unresolved externals
Could Not Find d:\GIT_REPOS_PERSONAL\MorrowEngine\bin\*.ilk
'.\bin\main.exe' is not recognized as an internal or external command,
operable program or batch file.
The terminal process terminated with exit code: 1
Это вывод терминала при попытке сборки. Не удается разрешить символы из 'Windows .h'. Это проблема, теперь давайте поговорим о некоторой методологии.
Мой подход состоял в том, чтобы настроить его вручную, установив расширение C / C ++ VSCode. Таким образом, оказывается, что на терминале VSCode не настроена правильная среда для компиляции с cl.exe по умолчанию, и официально поддерживаемого метода загрузки VSCode с терминалом, который выполняет другой набор переменных среды, не существует.
Это означает, что мы должны привести VSCode к .bat, который устанавливает среду в C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Auxiliary \ Build \ vcvarsall.bat
Он должен настроить этот терминал на правильную среду в VSCode, прежде чем использовать ЖЕ ТЕРМИНАЛ для запуска основной задачи сборки для программы.
Имея это в виду, я создал build.bat, который будет выполнять cl.exe только после запуска vcvarsall.bat
BUILD.BAT
@echo off
if exist "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" (
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64
) else (
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
)
set compilerflags=/Od /Zi /EHsc /std:c++latest /I include
set linkerflags=/OUT:bin\main.exe
cl.exe %compilerflags% src\*.cpp /link %linkerflags%
del bin\*.ilk *.obj *.pdb
ЗАДАЧИ. JSON
{
"version": "2.0.0",
"tasks": [
{
"label": "Build C++ project",
"type": "shell",
"group": {
"kind": "build",
"isDefault": true
},
"command": ".\\build.bat"
},
{
"label": "Build & run C++ project",
"type": "shell",
"group": {
"kind": "test",
"isDefault": true
},
"command": ".\\build.bat && .\\bin\\main.exe"
}
]
}
НАСТРОЙКИ. JSON
{
"files.associations": {
"*.tpp": "cpp"
},
"terminal.integrated.shell.windows": "cmd.exe"
}
Это вся конфигурация. Я проверил расширение C / C ++, чтобы убедиться, что оно также настроено для MSV C x64 по умолчанию. Расширение также ссылается на правильный путь cl.exe и не имеет дополнительных путей включения, кроме папки root рабочей области. У меня VS2019 BuildTools и не установлена копия Visual Studio.
Я не могу больше думать о соответствующей информации, но я уверен, что что-то упустил. Не стесняйтесь, дайте мне знать.