Я помню, как в древние времена люди заставляли запускать 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+ вариантов?