Где установлен MSV C? - Определение местоположения `cl.exe` и` link.exe` - PullRequest
0 голосов
/ 02 мая 2020

Я помню, как в древние времена люди заставляли запускать vcvarsall.bat перед тем, как что-то скомпилировать в Windows. Предполагая место установки по умолчанию, где я могу найти cl.exe, link.exe и друзей; если его нет в PATH?

Попытка:

#include <stdlib.h>
#include <stdio.h>

#include <Windows.h>

const inline LPCWSTR find_cl() {
    /* Most of this list derived from 
       https://gitlab.kitware.com/cmake/cmake/-/blob/417b765f/Modules/GetPrerequisites.cmake#L670 */
    static const LPCSTR cl_paths[12] = {
        "C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin",
        "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin",
        "C:\\Program Files (x86)\\Microsoft Visual Studio 11.0\\VC\\bin",
        "C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\bin",
        "C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\bin",
        "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin",
        "C:\\Program Files\\Microsoft Visual Studio 8\\VC\\BIN",
        "C:\\Program Files (x86)\\Microsoft Visual Studio 8\\VC\\BIN",
        "C:\\Program Files\\Microsoft Visual Studio .NET 2003\\VC7\\BIN",
        "C:\\Program Files (x86)\\Microsoft Visual Studio .NET 2003\\VC7\\BIN",
        "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.25.28610\\bin\\Hostx86\\x64",
        "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.25.28610\\bin\\Hostx86\\x86",
    };

    size_t i;
    for (i = 0; i < sizeof cl_paths / sizeof cl_paths[0]; i++)
        if (_access(cl_paths[i], 0) == 0)
            return cl_paths[i];
    return NULL;
}

С тривиальной точкой входа:

int main(void) {
    const LPCWSTR cl_path = find_cl();

    if (cl_path == NULL)
        return EXIT_FAILURE;

    printf("Found cl_path of: \"%s\"\n", cl_path);
    return EXIT_SUCCESS;
}

Я также обнаружу архитектуру, поэтому сначала ищите компилятор, соответствующий текущей архитектуре, а затем переходите к другим архитектурам. Я предполагаю, что где-то есть список из 30+ вариантов?

...