Код Visual Studio: как добавить аргументы для компилятора g ++? - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу использовать некоторые функции C ++ 17, которые в данный момент не поддерживаются в Ma c, поэтому я использую

brew install gcc --HEAD

для установки версии g ++ 10.0.1. Коды хорошо работают в терминале, напрямую вызывая

g++-HEAD -std=c++17 test.cpp

Я также создал ссылку ln -s g++-HEAD g++ в bash и добавил псевдоним alias g++='g++ -std=c++17' в .bash_profile, так что

g++ test.cpp

сделает то же самое.

Я хочу запустить код C ++ в Visual Studio Code - версия Ma c. После установки Microsoft C / C ++ Extension и расширения Code Runner я настроил файл settings.json в VSCode для включения аргумента компилятора:

{
    "C_Cpp.default.cppStandard": "c++17",
    "C_Cpp.default.compilerPath": "/usr/bin/g++",
    "C_Cpp.default.intelliSenseMode": "gcc-x64",
    "C_Cpp.default.compilerArgs": [
        "-std=c++17"
    ]
}

Затем я попытался запустить тот же код. Однако я получил предупреждение:

[Running] cd "/some directory/" && g++ test.cpp -o test && "/some directory/"test
warning: fold-expressions only available with '-std=c++17' or '-std=gnu++17'

Очевидно, это означает, что компилятор g ++, запускаемый в VSCode, не тот, который я вручную установил с помощью псевдонима. Что еще интереснее, если я запускаю непосредственно в VSCode TERMINAL, мой предыдущий код

g++ test.cpp -o test

работает.

Меня смущает установка в VSCode: почему бегун не использует тот же аргумент g++ компилятора, который используется в собственном терминале VSCode? Кроме того, как мне изменить файл settings.json или некоторые другие файлы в VSCode, чтобы я мог правильно добавить аргумент -std=c++17?

1 Ответ

0 голосов
/ 29 апреля 2020

Вот мое решение этой проблемы. Я связываю его с моими проектами Makefile.

Во-первых, вам нужно создать Makefile, если использование G CC с использованием Makefile само по себе является ... спорным, если не сказать больше. Но я думаю, что это служит целям этого примера. Как вы, возможно, знаете, запуск «make» вместо g ++ в текущем каталоге будет анализировать Makefile и запускать соответствующие команды. Но в вашем случае ваш Makefile может выглядеть примерно так:

#You're gonna wanna make it think that your executable doesnt exist, otherwise,
#because the executable exists, make will assume its the most recent build.
.PHONY: debug 


#using g++ and the flags inline like this, is generally seen as bad practice, it might be worth
#looking into using Makefiles to make this more acceptable, but this will get you started.
debug:
    g++ -g -o debug main.cpp -std=c++17

clean:
    rm debug
#if you copy this exactly, make you you replace the spaces with proper tab
#characters otherwise it will error out.

Часть Juicy находится в коде VS; Это очень мощная функция, известная как задачи. Задачи - это их особая кроличья нора, но, прямо скажем, вы добавляете задачу в массив «tasks» в сгенерированном файле task. json в вашей рабочей области, если вы не знакомы с тем, как это может выглядеть, Вот синтаксис для задачи:

    {
        "label": "[name of task]",
        "type": "[type of task, usually its a shell command]",
        "command": "[the actual command to call]"
    }

Есть много других функций, которые могут предложить задачи, но для создания инструмента сборки это все, что вам нужно, для меня это привело к файлу, который выглядел как это:

{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
    {
        "label": "build_debug",
        "type": "shell",
        "command": "make"
    },
    {
        "label": "clean",
        "type": "shell",
        "command": "make clean"
    },
    {
        "label": "build",
        "dependsOn": [
            "clean",
            "build_debug"
        ],
        "problemMatcher": [
            "$gcc"
        ]
    }
]
}

Зачем нам нужен финальный вызов сборки? потому что ваш объект запуска. json может принимать «preLaunchTask», который будет автоматически вызываться перед отладкой. Вы можете выполнить этот последний вызов сборки, и он скомпилирует, отладит и запустит ваше приложение. он даже интегрирует точки останова GDB и отслеживание памяти в рабочее пространство. Мой запуск. json выглядит следующим образом:

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
    {
        "name": "(gdb) Launch",
        "type": "cppdbg",
        "request": "launch",
        "program": "${workspaceFolder}/runnable",
        "args": [],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "preLaunchTask": "build",
        "setupCommands": [
            {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": false
            }
        ]
    }
]
}

Извините за долгое повторение, я надеюсь, что это поможет:)

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