Visual Studio Code MSV C C ++ Компилятор не работает - PullRequest
0 голосов
/ 29 января 2020

Я пытался заставить 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 с терминалом, который выполняет другой набор переменных среды, не существует.

  1. Это означает, что мы должны привести VSCode к .bat, который устанавливает среду в C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Auxiliary \ Build \ vcvarsall.bat

  2. Он должен настроить этот терминал на правильную среду в 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.

Я не могу больше думать о соответствующей информации, но я уверен, что что-то упустил. Не стесняйтесь, дайте мне знать.

1 Ответ

1 голос
/ 31 января 2020

paxbun с горячим ответом!

Мне нужно было связать user32.lib

Спасибо, сэр!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...