Архив метки: Visual Studio



Visual Studio: Ошибка unresolved external symbol _main

Рассматриваю пример кода на WinAPI:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
    return 0;
}

Если ничего не изменять, то в Visual Studio Community я получаю такое сообщение об ошибке:

Error (active) E0167 argument of type «const char *» is incompatible with parameter of type «LPCWSTR» Sample01 C:\Users\Denis\source\repos\WinAPI\Sample01\Start.cpp 6

 

Ладно, исправлю как нужно.

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, L"Goodbye, cruel world!", L"Note", MB_OK);
    return 0;
}

Теперь появляется ошибка при сборке проекта:

LNK2019 unresolved external symbol _main referenced in function «int __cdecl invoke_main(void)» (?invoke_main@@YAHXZ)

 

Чтобы исправить её, потребовалось изменить конфигурацию:
ProjectPropertiesConfiguration PropertiesLinkerSystemSubsystem
Здесь нужно сменить Console (/SUBSYSTEM.CONSOLE) на Windows (/SUBSYSTEM:WINDOWS)

Останется лишь Предупреждение такого типа:

Warning C28251 Inconsistent annotation for ‘WinMain’: this instance has no annotations. See c:\program files (x86)\windows kits\10\include\10.0.19041.0\um\winbase.h(1006). Sample01 C:\Users\Denis\source\repos\WinAPI\Sample01\Start.cpp 3

 

Его можно игнорировать. Но если вы хотите, чтобы не было даже предупреждений вида SAL Annotations, можно разнести переносы строк (хотя мне так не нравится):

#include <windows.h>

int WINAPI WinMain
(
    HINSTANCE _In_ hInstance,
    HINSTANCE _In_opt_ hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nCmdShow
)
{
    MessageBox(NULL, L"Goodbye, cruel world!", L"Note", MB_OK);
    return 0;
}
Отдельно сделаю примечание для компилятора MinGW-w64 — for 32 and 64 bit Windows (C++)
Здесь изначальный код работает, поэтому пришлось оставить его в таком виде:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
    return 0;
}

 



Visual Studio: Отключить для проекта контроль версий

У меня настроена политика SRP, поэтому как-то появилось предупреждение о заблокированном файле:

Access to C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\cmd\git.exe has been restricted by your Administrator by the default software restriction policy level.

 

Для контроля версий я использую GitHub Desktop, поэтому я захотел отключить встроенную в Visual Studio поддержку Git.
Вроде нашёл настройку здесь:
ToolsOptions…Source Control ▶ [Plug-in Selection] ▶ None

После этого нужно будет подтвердить свой выбор.

Для существующего проекта описанный выше способ не сработал, т.к. там уже использовался GithubDesktop. Данная утилита создала файлы для синхронизации через git.exe, их-то и перехватывала VS.

Отключение плагина контроля версий через консоль

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\Extensions\Community\MSSCCIHostActive.rgi_41972.3643236F_FC70_11D3_A536_0090278A1BB8.pkgdef

[$RootKey$\SourceControlProviders]
@="{53544C4D-FFD5-48A9-B04A-0700CCD31070}"

В папке с TeamFoundation нашлось ещё одно упоминание. Путь к файлу такой:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\TeamExplorer.pkgdef
В нём я встретил такую запись:

[$RootKey$\Packages\{7fe30a77-37f9-4cf2-83dd-96b207028e1b}]
@="SccProviderPackage"
"InprocServer32"="$System$\mscoree.dll"
"Class"="Microsoft.TeamFoundation.Git.Provider.SccProviderPackage"
"Assembly"="Microsoft.TeamFoundation.Git.Provider, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

[$RootKey$\Packages\{7FE5C29F-58EC-45F0-AF68-EC00D9ECD138}]
@="SccProviderStubPackage"
"InprocServer32"="$System$\mscoree.dll"
"Class"="Microsoft.TeamFoundation.Git.Provider.SccProviderStubPackage"
"Assembly"="Microsoft.TeamFoundation.Git.Provider, Version=16.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

И чуть ниже:

[$RootKey$\SourceControlProviders]
@="{11b8e6d7-c08b-4385-b321-321078cdd1f8}"

Благодаря этим строчкам мы узнали GUID плагинов, попробуем удалить его через Developer Command Prompt for VS 2019:
1. Создаём текстовый файл devenv.pkgundef
2. Добавляем в него строчку с нашим GUID в фигурных скобках:

[$RootKey$\SourceControlProviders\{11b8e6d7-c08b-4385-b321-321078cdd1f8}]
[$RootKey$\Packages\{7fe30a77-37f9-4cf2-83dd-96b207028e1b}]
[$RootKey$\Packages\{7FE5C29F-58EC-45F0-AF68-EC00D9ECD138}]

3. Копируем этот файл в папку:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE
4. Закрываем Visual Studio 2019
5. Запускаем с правами администратора Developer Command Prompt for VS 2019
6. В этой консоли переходим в папку с VS:

cd C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE

7. Выполняем обновление конфигурации:

devenv /updateconfiguration

При первом запуске Visual Studio плагин контроля версий не будет активен (будет выставлено значение None). Правда в правом нижнем углу редактора всё равно останется кнопочка «Add to Source Control». Если на неё нажать, всё подцепится заново.

Радикальный способ избавления от Git.exe

Необходимо добавить «.bak» (просто изменить расширение на другое) у следующих файлов:
«C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Microsoft.TeamFoundation.Git.Provider.dll»

«C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\VS SCC\VssProvider.dll»

И ещё один файл:
«C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\cmd\git.exe»