我正在尝试在macOS上使用clang++构建带有多个* .cpp文件的简单项目。

task.json:

    {
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "clang++ build active file",
            "command": "/usr/bin/clang++",
            "args": [
                "-std=c++17",
                "-Wall",
                "-Wextra",
                "-Weffc++",
                "-Wconversion",
                "-pedantic-errors",
                "-stdlib=libc++",
                "-g",
                "${workspaceFolder}/*.cpp",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

结果命令如下所示:
/usr/bin/clang++ -std=c++17 -Wall -Wextra -Weffc++ -Wconversion -pedantic-errors -stdlib=libc++ -g '/Users/USER/Developer/WORKINGDIR/Lesson 2/Lesson 2.8/*.cpp' -o '/Users/USER/Developer/WORKINGDIR/Lesson 2/Lesson 2.8/main'

但是编译器抛出错误:
clang: error: no such file or directory: '/Users/USER/Developer/WORKINGDIR/Lesson 2/Lesson 2.8/*.cpp'

但是,如果我更改从中指向文件的字符串:
'/Users/USER/Developer/WORKINGDIR/Lesson 2/Lesson 2.8/*.cpp'

对此(不带引号,并添加“\”):
/Users/USER/Developer/WORKINGDIR/Lesson\ 2/Lesson\ 2.8/*.cpp

一切都编译良好。

但是,如何在tasks.json中配置相同的字符串?还是应该在那里更改使其正常工作?

最佳答案

不要使tasks.json复杂化。最好使用诸如CMake之类的东西来处理所有这些配置(C++版本,编译标志和警告等),并仅调用make(或ninja或您使用CMake选择的任何其他生成器)。

然后在tasks.json中,“选项”中的“cwd”值将指向构建文件夹(运行CMake命令的文件夹)而不是源文件夹,“args”将是CMake中目标的名称(或如果要构建所有目标,则为空),“command”将是诸如“/ usr / bin / ninja”或“/ usr / bin / make”之类的内容,具体取决于您在CMake中选择的生成器。

这还具有一个优点,即不管其他人是谁,其他人都可以从中受益(或为您创建)。

您正在使用的标志的CMakeLists.txt文件可能类似于

project(TheProjectName)
cmake_minimum_required(VERSION 3.10)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED YES)

add_compile_options(-Wall)
add_compile_options(-Wextra)
add_compile_options(-pedantic-errors)
add_compile_options(-Weffc++)
add_compile_options(-Wconversion)
add_compile_options(-stdlib=libc++)

# This is the executable target "main" is the name of the executable
# and you can change to something else
add_executable(main main.cpp
  other_file.h
  other_file.cpp
  some_other_file.h
  some_other_file.cpp
  )
-g中未设置用于指定调试版本的CMakeLists.txt选项。相反,当您运行cmake时,请将其构建类型设置为Debug

要使用此CMakeLists.txt文件,请在工作空间文件夹中创建一个build文件夹,然后在终端中转到该文件夹​​。然后运行命令cmake .. -DCMAKE_BUILD_TYPE=Debug一次。之后,您可以仅使用make文件夹中的build编译项目。在tasks.json中进行设置只是将“cwd”设置为指向${workspaceFolder}/build,并将命令设置为/usr/bin/make

最后要注意的是,如果同时安装了clang和gcc,则在运行cmake时,可能会使用gcc而不是clang。为了专门针对clang,请运行cmake命令,指定CXX和CC环境变量以指向clang。也就是说,cmake命令应运行(一次从build文件夹),如下所示:
CXX=clang++ CC=clang cmake .. -DCMAKE_BUILD_TYPE=Debug

关于c++ - 在macOS上使用clang++在Visual Studio Code中编译多个.cpp文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61876249/

10-16 13:52