Как Clang работает на Windows? - PullRequest
       8

Как Clang работает на Windows?

1 голос
/ 24 октября 2019


Мне интересно, как clang работает в системе Windows.

Я следовал руководству по на этом сайте и успешно собрал бинарный файл.

вотмой вопрос.

Когда я собираю проект в режиме отладки, он делает .exe, .pdb, .ilk.
Отладка также работает нормально, но когда я вхожу в какую-то функцию (например: std :: vector<> :: push_back), он находит векторный исходный файл в VisualStudio.

Я думаю, он не должен находить исходный файл, потому что реализация push_back должна принадлежать libclang.

Почему это происходит?

Код тестирования ниже

    auto answer = [](int n)
    {
        return 32 + n;
    };

    constexpr int response = answer(10);

и команда построения

C:/Program Files/LLVM/bin/clang++.exe' -std=c++2a ./example_1.cpp -o example_1.exe --debug

FYI В моей системе установлены VisualStudio 2015 и LLVM 9.0,Конфигурация кода против

    /* c_cpp_properties.json */
{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "C:/Program Files/LLVM/include/llvm-c",
                "C:/Program Files/LLVM/include/clang-c"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "8.1",
            "compilerPath": "\"C:/Program Files/LLVM/bin/clang++.exe\"",
            "cStandard": "c11",
            "cppStandard": "c++20",
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}


    /* launch.json */
{
    "version": "0.2.0",
    "configurations": [
      {
        "name": "(Windows) Launch",
        "type": "cppvsdbg",
        "request": "launch",
        "program": "${workspaceFolder}/example_1.exe",  
        "args": [],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": true
      }
    ]
  }
}

    /* tasks.json */
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558 
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "clang++.exe build active file",
            "command": "C:/Program Files/LLVM/bin/clang++.exe",
            "args": [
                "-std=c++2a",
                "./example_1.cpp",
                "-o",
                "example_1.exe",
                "--debug"
            ],
            "group": "build"
        }
    ]
}

Ответы [ 2 ]

4 голосов
/ 24 октября 2019

Clang - это просто компилятор, причем гибкий. Проект зонтика LLVM, частью которого является Clang, также предоставляет компоновщик (lld) и стандартную библиотеку C ++ (libc ++) среди других низкоуровневых вещей.

В Windows у вас есть два основных варианта:

  1. Использовать clang-cl: компилируется с помощью Clang-оболочки, которая понимает параметры cl.exe. Это ссылка на среду выполнения / библиотеку Visual C ++, и, таким образом, вы на самом деле заменяете только компилятор Visual Studio, но не библиотеку / среду выполнения. Подобный код, который вы компилируете, должен быть совместим с обычным кодом, скомпилированным MSVC.

  2. Использовать clang: это драйвер clang, который понимает GCC-подобные параметры. Вы можете использовать его, если хотите компилировать против среды выполнения MinGW-w64.

Clang имеет возможность выбрать стандартную библиотеку C ++: -stdlib=libc++ выбирает LLVM libc ++. Я сомневаюсь, что это работает для clang-cl, но я не пробовал, чтобы быть честным. Если вы устанавливаете Clang + libc ++ через MSYS2 , вы можете скомпилировать с использованием libc ++ и среды выполнения MinGW-w64, используя параметр -stdlib.


Что касается вашей конкретной проблемы: вам кажется,использовать интерфейс в стиле GNU для Clang, но он определяет, что вы находитесь в Windows, и компилирует, как если бы это был clang-cl. Я думаю, что вам лучше всего попробовать clang с таргетингом на MinGW-w64 (например, из MSYS2, как я предлагал выше).

Поскольку Clang - гибкий компилятор, вы также можете указать цель с помощью командной строки -targetвариант. К сожалению, я не знаю значений, которые вам понадобятся (и дополнительных опций, которые позволят ему найти заголовочные файлы / библиотеки libc ++). При этом я не уверен, что libc ++ вообще работает для Visual Studio, ориентированной на Clang.

0 голосов
/ 24 октября 2019

Некоторые заметки прошлого года о неудачной попытке создать значительную кодовую базу в Windows с Clang под CMake (он основан на MacOS и двух версиях Linux):

  • Чтобы заставить CMake генерироваться наОкна, координаты иглы в многомерном стоге сена: x64 Native Command Prompt, NMake Makefiles, clang-cl.exe, CMAKE_CACHE_ARGS -D CMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}. (Книга Packt по CMake прилична на этот раз, но не объясняет большую часть этого.)
  • @ rubenvb был прав, если скептически относился к опции -stdlib в Windows;даже --help не так: «Но на самом деле использование« -stdlib = »дает предупреждение о неиспользованном аргументе», bugs.llvm.org/show_bug.cgi?id=39878
...