From c07c602e1d12f5ba8c31f59f6e78045221542732 Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Tue, 19 Mar 2024 19:14:15 -0700 Subject: [PATCH] draft (#5499) * draft * update alt+text to be more accessible * acronlix and fix some image syntax * fix tags * fix link * acrolinx. link fixing * fix link * fix dupe alttext * edit pass * fix link --------- Co-authored-by: TylerMSFT --- docs/build/clang-support-msbuild.md | 28 +++-- docs/build/cmake-projects-in-visual-studio.md | 85 ++++++++----- docs/build/media/cmake-targets-view.png | Bin 31889 -> 8406 bytes docs/build/vscpp-step-2-build.md | 24 ++-- docs/build/walkthrough-build-debug-wsl2.md | 51 ++++---- docs/build/working-with-project-properties.md | 33 ++++-- ...-to-create-and-use-shared-ptr-instances.md | 13 +- docs/get-started/tutorial-console-cpp.md | 112 +++++++++++------- .../connect-to-your-remote-linux-computer.md | 38 +++--- docs/linux/media/remote-logging-vs2019.png | Bin 22905 -> 22910 bytes 10 files changed, 241 insertions(+), 143 deletions(-) diff --git a/docs/build/clang-support-msbuild.md b/docs/build/clang-support-msbuild.md index 5c13bc7ace6..08c9adec552 100644 --- a/docs/build/clang-support-msbuild.md +++ b/docs/build/clang-support-msbuild.md @@ -1,7 +1,7 @@ --- description: "Learn more about: Clang/LLVM support in Visual Studio projects" title: "Clang/LLVM support in Visual Studio projects" -ms.date: 09/20/2022 +ms.date: 03/13/2024 ms.description: "Configure a Visual Studio MSBuild project to use the Clang/LLVM toolchain." helpviewer_keywords: ["Clang support for C++ MSBuild projects"] --- @@ -34,10 +34,16 @@ The Microsoft C++ Standard Library requires at least Clang 8.0.0. ::: moniker-end ::: moniker range="=msvc-160" -![Screenshot of the Visual Studio installer with the Individual components tab selected and the C plus plus Clang components visible.](media/clang-install-vs2019.png) +:::image type="complex" source="media/clang-install-vs2019.png" alt-text="Screenshot of the Visual Studio 2019 installer"::: +The Individual components tab is selected in the installer. C++ Clang Compiler for Windows is selected. C++ Clang-cl for v142 build tools (x64/x86) is also selected. +:::image-end::: + ::: moniker-end ::: moniker range=">=msvc-170" -![Screenshot of the Visual Studio installer with the Individual components tab selected and the C plus plus Clang components visible.](media/clang-install-vs2022.png) +:::image type="complex" source="media/clang-install-vs2022.png" alt-text="Screenshot of the Visual Studio 2022 installer." +The Individual components tab is selected in the installer. C++ Clang Compiler for Windows is selected. MSBuild support for LLVM (clang-cl) toolset is also selected. +::: image-end ::: + ::: moniker-end ::: moniker range=">=msvc-160" @@ -47,9 +53,11 @@ Later versions of Visual Studio provide newer versions of the Clang toolset. The To configure a Visual Studio project to use Clang, right-click on the project node in **Solution Explorer** and choose **Properties**. Typically, you should first choose **All configurations** at the top of the dialog. Then, under **General** > **Platform Toolset**, choose **LLVM (clang-cl)** and then **OK**. -![Screenshot of the Property Pages dialog box with Configuration Properties > General selected and the Platform Toolset and LLVM (clang-cl) option highlighted.](media/llvm-msbuild-prop-page.png) +:::image type="complex" source="media/llvm-msbuild-prop-page.png" alt-text="Screenshot of the Visual Studio project Property Pages dialog box."::: +The project properties page is open to the Configuration Properties > General page. The Platform Toolset dropdown is selected, on which LLVM (clang-cl) is selected. +:::image-end::: -If you're using the Clang tools that are bundled with Visual Studio, no extra steps are required. For Windows projects, Visual Studio by default invokes Clang in [clang-cl](https://llvm.org/devmtg/2014-04/PDFs/Talks/clang-cl.pdf) mode. It links with the Microsoft implementation of the Standard Library. By default, **clang-cl.exe** is located in *%VCINSTALLDIR%\\Tools\\Llvm\\bin\\* and *%VCINSTALLDIR%\\Tools\\Llvm\\x64\\bin\\*. +If you're using the Clang tools that are bundled with Visual Studio, no extra steps are required. For Windows projects, Visual Studio by default invokes Clang in [clang-cl](https://llvm.org/devmtg/2014-04/PDFs/Talks/clang-cl.pdf) mode. It links with the Microsoft implementation of the Standard Library. By default, **clang-cl.exe** is located in `*%VCINSTALLDIR%\Tools\Llvm\bin\*` and `*%VCINSTALLDIR%\Tools\Llvm\x64\bin\*`. If you're using a custom Clang installation, you can change the value of the `LLVMInstallDir` property. For more information, see [Set a custom LLVM location](#custom_llvm_location). @@ -64,7 +72,9 @@ To configure a Visual Studio Linux project to use Clang: 1. Under **General** > **Platform Toolset**, choose **Clang for Windows Subsystem for Linux** if you're using Windows Subsystem for Linux (WSL). Choose **Clang for Remote Linux** if you're using a remote machine or VM. 1. Press **OK**. -![Screenshot of the Console App clang Visual Studio 2019 Property Pages dialog box with Configuration Properties > General selected and the Platform Toolset and L L V M (clang c l) options highlighted.](media/clang-msbuild-prop-page.png) +:::image type="complex" source="media/clang-msbuild-prop-page.png" alt-text="Screenshot of the Visual Studio 2019 project Property Pages dialog box"::: +The project properties page is open to the Configuration Properties > General page. Platform Toolset is selected and from the list of options, LLVM (clang- c l) is selected." +:::image-end::: On Linux, Visual Studio by default uses the first Clang location that it finds in the PATH environment property. If you're using a custom Clang installation, then either change the value of the `LLVMInstallDir` property or else enter the path under **Project** > **Properties** > **Configuration Properties** > **VC++ DIrectories** > **Executable Directories**. For more information, see [Set a custom LLVM location](#custom_llvm_location). @@ -97,7 +107,7 @@ Starting in Visual Studio 2019 version 16.9, you can set a custom toolset versio The **LLVM Toolset Version** property only appears when the LLVM platform toolset is selected. -When you add a *Directory.build.props* file to a project or solution, the settings appear as the default in the project Property Pages dialog. However, changes to these properties in Visual Studio override the settings in the *Directory.build.props* file. +When you add a `Directory.build.props` file to a project or solution, the settings appear as the default in the project Property Pages dialog. However, changes to these properties in Visual Studio override the settings in the `Directory.build.props` file. ## Set properties, edit, build, and debug @@ -105,6 +115,6 @@ After you have set up a Clang configuration, right-click again on the project no When debugging, you can use breakpoints, memory and data visualization, and most other debugging features. -![Screenshot of Visual Studio showing Clang debugging.](media/clang-debug-msbuild.png) - +:::image type="complex" source="media/clang-debug-msbuild.png" alt-text="Screenshot of Visual Studio debugging a sample app"::: +The portion of the app that is visible creates a string vector and adds some strings to it. Execution has stopped on a breakpoint for the code: v.push_back("Clang/LLVM");." ::: moniker-end diff --git a/docs/build/cmake-projects-in-visual-studio.md b/docs/build/cmake-projects-in-visual-studio.md index a59836334c3..01cc9f2beea 100644 --- a/docs/build/cmake-projects-in-visual-studio.md +++ b/docs/build/cmake-projects-in-visual-studio.md @@ -19,7 +19,9 @@ Visual Studio's native support for CMake enables you to edit, build, and debug C **C++ CMake tools for Windows** is installed as part of the **Desktop development with C++** and **Linux Development with C++** workloads. Both **C++ CMake tools for Windows** and **Linux Development with C++** are required for cross-platform CMake development. -![Screenshot of the Desktop development with C plus plus dropdown selected and the C plus plus C Make tools for Windows option called out.](media/cmake-install-2019.png) +:::image type="complex" source="media/cmake-install-2019.png" alt-text="Screenshot of the Visual Studio installer."::: +In the installer, the Desktop development with C plus plus dropdown is selected and C plus plus C Make tools for Windows is selected." +:::image-end::: For more information, see [Install the C++ Linux workload in Visual Studio](../linux/download-install-and-setup-the-linux-development-workload.md). @@ -27,7 +29,9 @@ For more information, see [Install the C++ Linux workload in Visual Studio](../l When you **open a folder** containing a *`CMakeLists.txt`* file, the following things happen. -![A screenshot of the Start Window in Visual Studio.](media/start-window.png) +:::image type="complex" source="media/start-window.png" alt-text="Screenshot of the first dialog that opens when Visual Studio is started."::: +The dialog offers these options: clone a repository, open a project or solution, open a local folder, or create a new project. Open a local folder is called out in the screenshot. +:::image-end::: - Visual Studio adds **CMake** items to the **Project** menu, with commands for viewing and editing CMake scripts. @@ -42,7 +46,7 @@ When you **open a folder** containing a *`CMakeLists.txt`* file, the following t Once CMake cache generation has succeeded, you can also view your projects organized logically by targets. Choose the **Select View** button on the **Solution Explorer** toolbar. From the list in **Solution Explorer - Views**, select **CMake Targets View** and press **Enter** to open the targets view: -:::image type="content" source="media/cmake-targets-view2.png" alt-text="Screenshot of the Solution Explorer Views window with the C Make Targets View highlighted."::: +:::image type="content" source="media/cmake-targets-view2.png" alt-text="Screenshot of the Solution Explorer Views window. The folder view is open. The C Make Targets View option is highlighted."::: Choose the **Show All Files** button at the top of **Solution Explorer** to see all the CMake-generated output in the *`out/build/`* folders. @@ -55,11 +59,8 @@ To pass arguments to an executable at debug time, you can use another file calle Most Visual Studio and C++ language features are supported by CMake projects in Visual Studio. Examples include: - [Edit and Continue for CMake projects](#edit-and-continue-for-cmake-projects) - - [Incredibuild integration for CMake projects](https://devblogs.microsoft.com/cppblog/seamlessly-accelerate-cmake-projects-in-visual-studio-with-incredibuild/) - - [AddressSanitizer support for CMake projects](cmake-presets-vs.md#enable-addresssanitizer-for-windows-and-linux) - - [Clang/LLVM support](https://devblogs.microsoft.com/cppblog/clang-llvm-support-in-visual-studio/) > [!NOTE] @@ -73,7 +74,9 @@ Visual Studio uses a CMake configuration file to drive CMake generation and buil When you make significant changes to your CMake configuration file or a *`CMakeLists.txt`* file, Visual Studio will automatically run the CMake configure step. You can invoke the configure step manually: Select **Project > Configure Cache** from the toolbar. You can also change your configuration preferences in **Tools** > **Options** > **CMake** > **General**. -![CMake configuration options.](media/cmake-configure-options.png) +:::image type="complex" source="media/cmake-configure-options.png" alt-text="Screenshot of the CMake configuration options in the Visual Studio settings window."::: +The CMake configure settings are called out. Show C Make cache notifications is selected. Under 'When cache is out of date:', the option 'Never run configure step automatically' is selected. +:::image-end::: If the configure step finishes without errors, then the information that's available drives C++ IntelliSense and language services. It's also used in build and debug operations. @@ -109,7 +112,9 @@ To build a CMake project, you have these choices: As you would expect, build results are shown in the **Output Window** and **Error List**. -![CMake build errors.](media/cmake-build-errors.png "CMake build errors") +:::image type="content" source="media/cmake-build-errors.png" alt-text="Screenshot of the Visual Studio Error List window"::: +CMake build warnings about conversions that may result in data loss such as converting from a float to an integer, are visible. +:::image-end::: ### Edit build settings @@ -119,7 +124,9 @@ Visual Studio uses a CMake configuration file to drive CMake builds. CMake confi All executable CMake targets are shown in the **Startup Item** dropdown in the toolbar. To start debugging, select one and press the **Debug > Start Debugging** button in the toolbar. In a CMake project, the "Current document" option is only valid for .cpp files. -![A screenshot of the Startup Item dropdown in a CMake project.](media/debug-target.png "The Startup Item dropdown in a CMake project") +:::image type="complex" source="media/debug-target.png" alt-text="Screenshot of the Visual Studio debug dropdown."::: +The dropdown has these options: Show / Hide debug targets, current document, samples (which is highlighted), box2d_tests, and samples-noGUI. +:::image-end::: The **Debug** or **F5** commands first build the project if changes have been made since the previous build. Changes to the CMake configuration file (*`CMakePresets.json`* or *`CMakeSettings.json`*) or a *`CMakeLists.txt`* causes the CMake cache to be regenerated. @@ -144,7 +151,9 @@ endif() Visual Studio allows you to debug a process running on a remote Linux system or WSL and debug it with the GDB debugger. To get started, select **Debug** > **Attach to Process...**, set the **Connection type** to **SSH**, and select your **Connection target** from the list of connections in the Connection Manager. Select a process from the list of available processes and press **Attach**. GDB must be installed on your Linux machine. For more information on SSH connections, see the [Connection Manager](../linux/connect-to-your-remote-linux-computer.md) -![A screenshot of the Attach to Process menu.](media/attach-to-process.png) +:::image type="complex" source="media/attach-to-process.png" alt-text="Screenshot of the Attach to Process menu in Visual Studio."::: +The following options are available on the dialog: Connection type (set to SSH), the connection target (set to demo@ 172. 20. 60. 6), and a list of available processes you can attach to." +:::image-end::: ## CMake partial activation @@ -188,23 +197,31 @@ When your custom or preferred tools generate your cache, CMake places files unde To edit a *`CMakeLists.txt`* file, right-click on the file in **Solution Explorer** and choose **Open**. If you make changes to the file, a yellow status bar appears and informs you that IntelliSense will update. It gives you a chance to cancel the update operation. For information about *`CMakeLists.txt`*, see the [CMake documentation](https://cmake.org/documentation/). -![CMakeLists.txt file editing.](media/cmake-cmakelists.png "CMakeLists.txt file editing") +:::image type="complex" source="media/cmake-cmakelists.png" alt-text="Screenshot of a C Make Lists .txt file being edited in Visual Studio." +It contains the lines project (hello-cmake), add_subdirectory (tests), add_executable (hello hello.cpp), and install (TARGETS hello DESTINATION hello/bin). A message at the top of the window says that c plus plus IntelliSense info will refresh after C Make finishes generating the cache. +:::image-end::: As soon as you save the file, the configuration step automatically runs again and displays information in the **Output** window. Errors and warnings are shown in the **Error List** or **Output** window. Double-click on an error in the **Error List** to navigate to the offending line in *`CMakeLists.txt`*. -![CMakeLists.txt file errors.](media/cmake-cmakelists-error.png "CMakeLists.txt file errors") +:::image type="complex" source="media/cmake-cmakelists-error.png" alt-text="Screenshot of a C Make error in the Visual Studio error list."::: +A C Make error message on line 3 of CMakeLists.txt is highlighted. The details are that C Make couldn't find a package configuration file provided by sqlite3. C Make looked for it in CMAKE_MODULE_PATH but couldn't find it. The suggestion is to add the installation prefix 'sqlite3' to CMAKE_PREFIX_PATH or set sqlite3_DIR to a directory containing sqlite3Config.cmake and/or sqlitet3-config.cmake. +:::image-end::: ### Language services for CMake Language services for CMake are available in Visual Studio 2019 version 16.5 or later. It supports code navigation features like Go To Definition, Peek Definition, and Find All References for CMake variables, functions, and targets in CMake script files. For more information, see [Code Navigation for CMake Scripts](https://devblogs.microsoft.com/cppblog/code-navigation-for-cmake-scripts/). -![Find All References on a CMake variable, target, or function.](media/cmake-find-all-refs.png) +:::image type="complex" source="media/cmake-find-all-refs.png" alt-text="Screenshot of the Visual Studio Find All References window."::: +Results of where SUPERTUX_SOURCES_CXX are found are shown. For example, in list(SORT SSUPERTUX_SOURCES_CXX), file(GLOB SUPERTUX_SOURCES_CXX) and so on. +:::image-end::: ### CMake project manipulation CMake project manipulation is available in Visual Studio 2019 version 16.5 or later. Project manipulation enables you to add, remove, and rename source files and targets in your CMake project without manually editing your CMake scripts. When you add or remove files from the Solution Explorer, Visual Studio automatically edits your CMake project. There could be more than one place where it makes sense to add or remove a reference to a CMake script. If so, Visual Studio asks you where you want to make the change and displays a preview of the proposed changes. For step-by-step instructions, see [Add, Remove, and Rename Files and Targets in CMake Projects](https://devblogs.microsoft.com/cppblog/easily-add-remove-and-rename-files-and-targets-in-cmake-projects/). -![Resolving ambiguity with CMake project manipulation.](media/cmake-project-manipulation.png) +:::image type="complex" source="media/cmake-project-manipulation.png" alt-text="Screenshot of the Visual Studio Preview Changes dialog box."::: +A tree view shows CMakeLists.txt, under which are two items: add_executable and set. Set is checked. The preview window shows where changes will be made. The line set (PROJECT_SRC "CmakeProject4.cpp" "CMakeProject4.h" shows "Demo.cpp" highlighted before the closing parenthesis. The apply button accepts the change, or you can press cancel. +:::image-end::: ## IntelliSense for CMake projects @@ -251,13 +268,13 @@ Visual Studio 2017 has rich support for CMake, including [cross-platform CMake p **Visual C++ Tools for CMake** is installed as part of the **Desktop development with C++** and **Linux Development with C++** workloads. -![Screenshot of the Individual components tab with the Visual C plus plus tools for C make option called out.](media/cmake-install.png) +:::image type="content" source="media/cmake-install.png" alt-text="Screenshot of the Visual Studio Installer. The Individual components tab is selected on which Visual C plus plus tools for CMake is selected."::: For more information, see [Install the C++ Linux workload in Visual Studio](../linux/download-install-and-setup-the-linux-development-workload.md). ## IDE integration -When you choose **File > Open > Folder** to open a folder containing a *`CMakeLists.txt`* file, the following things happen: +When you choose **File > Open > Folder** to open a folder containing a *`CMakeLists.txt`* file, the following happens: - Visual Studio adds a **CMake** menu item to the main menu, with commands for viewing and editing CMake scripts. @@ -269,11 +286,13 @@ When you choose **File > Open > Folder** to open a folder containing a *`CMakeLi You can open folders containing any number of CMake projects. Visual Studio detects and configures all the "root" *`CMakeLists.txt`* files in your workspace. CMake operations (configure, build, debug), C++ IntelliSense, and browsing are available to all CMake projects in your workspace. -![CMake project with multiple roots.](media/cmake-multiple-roots.png) +:::image type="complex" source="media/cmake-multiple-roots.png" alt-text="Screenshot of the Visual Studio Solution Explorer."::: +The files and folders of a CMake project are visible. There's a tests subdirectory, CMakeLists.txt, and hello.cpp. There's a hello-cmake-vcpkg folder that contains CMakeLists.txt, CMakeSettings.json, and hello.cpp. +:::image-end::: You can also view your projects organized logically by targets. Choose **Targets view** from the dropdown in the **Solution Explorer** toolbar: -![CMake targets view button.](media/cmake-targets-view.png) +:::image type="content" source="media/cmake-targets-view.png" alt-text="Screenshot of the dropdown button in the Visual Studio Solution Explorer that offers the CMake targets view option. Which is selected."::: Visual Studio uses a file called *`CMakeSettings.json`* to store environment variables or command-line options for CMake. *`CMakeSettings.json`* also enables you to define and store multiple CMake build configurations. You can conveniently switch between them in the IDE. @@ -288,19 +307,19 @@ If you need to pass arguments to an executable at debug time, you can use anothe When you import an existing *`CMakeCache.txt`* file, Visual Studio automatically extracts customized variables and creates a pre-populated *`CMakeSettings.json`* file based on them. The original cache isn't modified in any way. It can still be used from the command line, or with whatever tool or IDE used to generate it. The new *`CMakeSettings.json`* file is placed alongside the project's root *`CMakeLists.txt`*. Visual Studio generates a new cache based the settings file. You can override automatic cache generation in the **Tools > Options > CMake > General** dialog. -Not everything in the cache is imported. Properties such as the generator and the location of the compilers are replaced with defaults that are known to work well with the IDE. +Not everything in the cache is imported. Properties such as the generator and the location of the compilers are replaced with defaults that are known to work well with the IDE. ### To import an existing cache 1. From the main menu, choose **File > Open > CMake**: - ![Open CMake.](media/cmake-file-open.png "File, Open, CMake") + :::image type="content" source="media/cmake-file-open.png" alt-text="Screenshot of the Visual Studio main menu. File > Open > C Make is selected."::: This command brings up the **Import CMake from Cache** wizard. 2. Navigate to the *`CMakeCache.txt`* file that you want to import, and then choose **OK**. The **Import CMake Project from Cache** wizard appears: - ![Import a CMake cache.](media/cmake-import-wizard.png "Open the CMake import cache wizard") + :::image type="content" source="media/cmake-import-wizard.png" alt-text="Screenshot of the Import CMake Project from Cache wizard. The directory path of the CMake project to import goes in the `folder` textbox."::: When the wizard completes, you can see the new *`CMakeCache.txt`* file in **Solution Explorer** next to the root *`CMakeLists.txt`* file in your project. @@ -314,13 +333,17 @@ To build a CMake project, you have these choices: 1. From the main menu, select **Build > Build Solution** (**F7** or **Ctrl+Shift+B**). Make sure that a CMake target is already selected in the **Startup Item** dropdown in the **General** toolbar. -![CMake build menu command.](media/cmake-build-menu.png "CMake build command menu") +:::image type="complex" source="media/cmake-build-menu.png" alt-text="Screenshot of the Visual Studio Solution Explorer after right-clicking CMakeLists.txt."::: +The menu has options such as Add, Open, Configure tasks, Build, Clean all, and so on. +:::image-end::: You can customize build configurations, environment variables, command-line arguments, and other settings in the *`CMakeSettings.json`* file. It lets you make changes without modifying the *`CMakeLists.txt`* file. For more information, see [Customize CMake settings](customize-cmake-settings.md). As you would expect, build results are shown in the **Output Window** and **Error List**. -![CMake build errors.](media/cmake-build-errors.png "CMake build errors") +:::image type="complex" source="media/cmake-build-errors.png" alt-text="Screenshot of the Visual Studio Error List window."::: +CMake build warnings about conversions that may result in data loss such as converting from a float to an integer are visible. +:::image-end::: In a folder with multiple build targets, you can specify which CMake target to build: Choose the **Build** item on the **CMake** menu or the *`CMakeLists.txt`* context menu to specify the target. If you enter **Ctrl+Shift+B** in a CMake project, it builds the current active document. @@ -328,7 +351,7 @@ In a folder with multiple build targets, you can specify which CMake target to b To debug a CMake project, choose the preferred configuration and press **F5**. Or, press the **Run** button in the toolbar. If the **Run** button says "Select Startup Item", select the dropdown arrow and choose the target that you want to run. (In a CMake project, the "Current document" option is only valid for .cpp files.) -![CMake run button.](media/cmake-run-button.png "CMake run button") +:::image type="content" source="media/cmake-run-button.png" alt-text="Screenshot of the Select Startup Item dropdown for a CMake project. You can select current document or hello-cmake.exe"::: The **Run** or **F5** commands first build the project if changes have been made since the previous build. @@ -338,11 +361,15 @@ You can customize a CMake debugging session by setting properties in the *`launc To edit a *`CMakeLists.txt`* file, right-click on the file in **Solution Explorer** and choose **Open**. If you make changes to the file, a yellow status bar appears and informs you that IntelliSense will update. It gives you a chance to cancel the update operation. For information about *`CMakeLists.txt`*, see the [CMake documentation](https://cmake.org/documentation/). - ![CMakeLists.txt file editing.](media/cmake-cmakelists.png "CMakeLists.txt file editing") + :::image type="complex" source="media/cmake-cmakelists.png" alt-text="Screenshot of a C Make Lists .txt file being edited in Visual Studio."::: + The file contains: project (hello-cmake), add_subdirectory (tests), add_executable (hello hello.cpp), and install (TARGETS hello DESTINATION hello/bin). A message at the top of the window says that c plus plus IntelliSense info will refresh after C Make finishes generating the cache. + :::image-end::: As soon as you save the file, the configuration step automatically runs again and displays information in the **Output** window. Errors and warnings are shown in the **Error List** or **Output** window. Double-click on an error in the **Error List** to navigate to the offending line in *`CMakeLists.txt`*. - ![CMakeLists.txt file errors.](media/cmake-cmakelists-error.png "CMakeLists.txt file errors") + :::image type="complex" source="media/cmake-cmakelists-error.png" alt-text="Screenshot of a C Make error in the Visual Studio error list."::: + A C Make error message on line 3 of CMakeLists.txt is highlighted. The details are that C Make can't find a package configuration file provided by sqlite3. C Make looked for it in CMAKE_MODULE_PATH but couldn't find it. The suggestion is to add the installation prefix 'sqlite3' to CMAKE_PREFIX_PATH or set sqlite3_DIR to a directory containing sqlite3Config.cmake and/or sqlitet3-config.cmake. + :::image-end::: ## CMake configure step @@ -350,7 +377,9 @@ When significant changes are made to the *`CMakeSettings.json`* or to *`CMakeLi Multiple CMake projects might use the same CMake configuration name (for example, x86-Debug). All of them are configured and built (in their own build root folder) when that configuration is selected. You can debug the targets from all of the CMake projects that participate in that CMake configuration. - ![CMake Build Only menu item.](media/cmake-build-only.png "CMake Build Only menu item") + :::image type="complex" source="media/cmake-build-only.png" alt-text="Screenshot of Visual Studio's main menu, open to CMake > Build Only."::: + The context menu shows what can be built--in this case hello-cmake-a \ hello-cmake.exe (Project hello-cmake) and hello-cmake-b\hello-cmake.exe (Project hello-cmake). The latter is highlighted. + :::image-end::: You can limit builds and debug sessions to a subset of the projects in the workspace. Create a new configuration with a unique name in the *`CMakeSettings.json`* file. Then, apply the configuration to those projects only. When that configuration is selected, IntelliSense and the build and debug commands only apply to those specified projects. @@ -372,7 +401,7 @@ Automatic cache generation can be disabled in the **Tools > Options > CMake > Ge To build a single file in a CMake project, right-click on the file in **Solution Explorer**. Choose **Compile** from the pop-up menu. You can also build the currently open file in the editor by using the main **CMake** menu: -![CMake single file compilation.](media/cmake-single-file-compile.png) +:::image type="content" source="media/cmake-single-file-compile.png" alt-text="Screenshot of the CMake > Compile context menu. It contains one entry: Bullet3Collision."::: ## Run CMake from the command line diff --git a/docs/build/media/cmake-targets-view.png b/docs/build/media/cmake-targets-view.png index 8f1af186b8ff8fd747f3c24257f373a1756fe889..ac9dab9002f99c1b0b6664000c73d36bf38521f1 100644 GIT binary patch literal 8406 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 diff --git a/docs/build/vscpp-step-2-build.md b/docs/build/vscpp-step-2-build.md index 2962b95827b..c5245431ebd 100644 --- a/docs/build/vscpp-step-2-build.md +++ b/docs/build/vscpp-step-2-build.md @@ -12,23 +12,29 @@ You've created a C++ console app project and entered your code. Now you can buil ## Prerequisites -- Have Visual Studio with the Desktop development with C++ workload installed and running on your computer. If it's not installed yet, follow the steps in [Install C++ support in Visual Studio](vscpp-step-0-installation.md). +- Have Visual Studio with the Desktop development with C++ workload installed and running on your computer. If it's not installed, follow the steps in [Install C++ support in Visual Studio](vscpp-step-0-installation.md). - Create a "Hello, World!" project. By default, it contains code to print `Hello World!`. If you haven't done this step yet, follow the steps in [Create a C++ console app project](vscpp-step-1-create.md). If Visual Studio looks like this, you're ready to build and run your app: - ![Screenshot of Visual Studio showing the Hello World source code in the editor.](media/vscpp-ready-to-build.png "Ready to build the new project") + :::image type="complex" source="media/vscpp-ready-to-build.png" alt-text="Screenshot of the Hello World source code in the Visual Studio editor."::: + The source consists of #include \ and a main function that does std::cout hello world and returns 0 from the function. + :::image-end::: ## Build and run your code in Visual Studio 1. To build your project, choose **Build Solution** from the **Build** menu. The **Output** window shows the results of the build process. - ![View of the sequence of actions you take to build the project.](media/vscpp-build-solution.gif "Build the project") + :::image type="complex" source="media/vscpp-build-solution.gif" alt-text="Animated screenshot showing the sequence of actions taken to build a project in Visual Studio."::: + First, Build is selected from the main menu. Then Build Solution is selected. The Output window shows the build output messages, including that the build is successful. + :::image-end::: 1. To run the code, on the menu bar, choose **Debug**, **Start without debugging**. - ![View of the actions you take to start the project.](media/vscpp-start-without-debugging.gif "Start the project") + :::image type="complex" source="media/vscpp-start-without-debugging.gif" alt-text="Video showing the actions taken to start a project in Visual Studio."::: + First, Debug is selected from the main menu. Then 'Start without debugging' is selected. A console window appears with the output of the program: Hello, World! + :::image-end::: A console window opens and then runs your app. When you start a console app in Visual Studio, it runs your code, then prints "Press any key to continue . . ." to give you a chance to see the output. @@ -57,9 +63,11 @@ Normally, you run console apps at the command prompt, not in Visual Studio. Once 4. In the command prompt window, right-click to paste the path to your app into the command prompt. Press Enter to run your app. - ![View of what happens when you run the app at the command prompt.](media/vscpp-run-in-cmd.gif "Run the app at the command prompt") + :::image type="complex" source="media/vscpp-run-in-cmd.gif" alt-text="Animated screenshot of Visual Studio 2022 that shows running an app from the command prompt."::: + First, the path of the program is determined by right-clicking the solution and selecting open folder in file explorer. The file explorer is navigated to the 'Debug' folder where the HelloWorld app is. The app is right-clicked, and Copy as Path selected. The run dialog is invoked and cmd.exe is run. A command line console appears. The path to the HelloWorld app is pasted in. The app runs, displaying: Hello World! + :::image-end::: -Congratulations, you've built and run a console app in Visual Studio! +Congratulations, you built and ran a console app in Visual Studio! [I ran into a problem.](#run-your-code-in-a-command-window-issues) @@ -81,14 +89,14 @@ If red squiggles appear under anything in the source code editor, the build may ::: moniker range=" **Options** > **CMake** > **General**. Select **Prefer using CMake Presets for configure, build, and test**, then select **OK**. Instead, you could have added a `CMakePresets.json` file to the root of the project. For more information, see [Enable CMake Presets integration](cmake-presets-vs.md#enable-cmakepresets-json-integration). - ![Screenshot of CMake general options screen with Use CMake Presets if available, otherwise use CMakeSettings.json highlighted and selected.](media/cmake-general-prefer-cmake-presets.png) + :::image type="complex" source="media/cmake-general-prefer-cmake-presets.png" alt-text="Screenshot of the Visual Studio project options. Cmake > General is selected."::: + In the CMake configuration file group, 'Use CMake Presets if available, otherwise use CMakeSettings.json' is called out and is selected. + :::image-end::: 6. To activate the integration: from the main menu, select **File** > **Close Folder**. The **Get started** page appears. Under **Open recent**, select the folder you just closed to reopen the folder. -7. There are three dropdowns across the Visual Studio main menu bar. Use the dropdown on the left to select your active target system. This is the system where CMake will be invoked to configure and build the project. Visual Studio queries for WSL installations with `wsl -l -v`. In the following image, **WSL2: Ubuntu-20.04** is shown selected as the **Target System**. +7. There are three dropdowns across the Visual Studio main menu bar. Use the dropdown on the left to select your active target system. This is the system where CMake is invoked to configure and build the project. Visual Studio queries for WSL installations with `wsl -l -v`. In the following image, **WSL2: Ubuntu-20.04** is shown selected as the **Target System**. - ![Target system dropdown shows WSL2: Ubuntu-20.04 as being selected.](media/vs2022-target-system-dropdown.png) + :::image type="content" source="media/vs2022-target-system-dropdown.png" alt-text="Screenshot of the Visual Studio target system dropdown. WSL2: Ubuntu-20.04 is the selected."::: > [!NOTE] > If Visual Studio starts to configure your project automatically, read step 11 to manage CMake binary deployment, and then continue to the step below. To customize this behavior, see [Modify automatic configuration and cache notifications](cmake-presets-vs.md#modify-automatic-configuration-and-cache-notifications). 8. Use the dropdown in the middle to select your active Configure Preset. Configure Presets tell Visual Studio how to invoke CMake and generate the underlying build system. In step 7, the active Configure Preset is the **linux-default** Preset created by Visual Studio. To create a custom Configure Preset, select **Manage Configurations…** For more information about Configure Presets, see [Select a Configure Preset](cmake-presets-vs.md#select-a-configure-preset) and [Edit Presets](cmake-presets-vs.md#edit-presets). - ![Active configure preset dropdown, showing Manage Configurations... selected.](media/vs2022-ActivePresetDropdown.png) + :::image type="content" source="media/vs2022-ActivePresetDropdown.png" alt-text="Screenshot of the Visual Studio active configure preset dropdown. Manage Configurations... is selected."::: 9. Use the dropdown on the right to select your active Build Preset. Build Presets tell Visual Studio how to invoke build. In the illustration for step 7, the active Build Preset is the **Default** Build Preset created by Visual Studio. For more information about Build Presets, see [Select a Build Preset](cmake-presets-vs.md#select-a-build-preset). 10. Configure the project on WSL 2. If project generation doesn't start automatically, then manually invoke configure with **Project** > **Configure** *project-name* - ![Project configure drop-down showing Configure CMakeProject selected.](media/vs2022-project-configure.png) + :::image type="content" source="media/vs2022-project-configure.png" alt-text="Screenshot of the Visual Studio project configure dropdown. Configure CMakeProject is selected."::: -11. If you don't have a supported version of CMake installed on your WSL 2 distro, then Visual Studio will prompt you beneath the main menu ribbon to deploy a recent version of CMake. Select **Yes** to deploy CMake binaries to your WSL 2 distro. +11. If you don't have a supported version of CMake installed on your WSL 2 distro, then Visual Studio prompts you beneath the main menu ribbon to deploy a recent version of CMake. Select **Yes** to deploy CMake binaries to your WSL 2 distro. - ![Visual Studio prompt beneath the toolbar that says: supported cmake version is not present. Install latest CMake binaries from Cmake.org? Yes no.](media/vs2022-supported-cmake-not-present-prompt.png) + :::image type="complex" source="media/vs2022-supported-cmake-not-present-prompt.png" alt-text="Screenshot of a prompt beneath the Visual Studio toolbar"::: + The user is prompted whether to install the latest C Make binaries from C make . org because the supported C Make version isn't installed." + :::image-end::: -12. Confirm that the configure step has completed and that you can see the **CMake generation finished** message in the **Output** window under the **CMake** pane. Build files are written to a directory in the WSL 2 distro's file system. +12. Confirm that the configure step completed and that you can see the **CMake generation finished** message in the **Output** window under the **CMake** pane. Build files are written to a directory in the WSL 2 distro's file system. - ![Output window showing message that CMake generation is done.](media/vs-output-window-cmake-generation.png) + :::image type="content" source="media/vs-output-window-cmake-generation.png" alt-text="Screenshot of the Visual Studio Output window. It contains messages generated during the configure step, including that C Make generation is complete."::: 13. Select the active debug target. The debug dropdown menu lists all the CMake targets available to the project. - ![Debug dropdown menu showing CMakeProject selected.](media/vs-debug-dropdown-menu-cmake.png) + :::image type="content" source="media/vs-debug-dropdown-menu-cmake.png" alt-text="Screenshot of the Visual Studio debug dropdown menu. CMakeProject is selected."::: 14. Expand the project subfolder in the **Solution Explorer**. In the `CMakeProject.cpp` file, set a breakpoint in `main()`. You can also navigate to CMake targets view by selecting the View Picker button in the **Solution Explorer**, highlighted in following screenshot: - ![Solution explorer showing the button to switch views. The button is just to the right of the home (house) button.](media/solution-explorer-switch-view.png) + :::image type="content" source="media/solution-explorer-switch-view.png" alt-text="Screenshot of the Visual Studio solution explorer showing the button to switch views. It's located to the right of the home button."::: -15. Select **Debug** > **Start**, or press **F5**. Your project will build, the executable will launch on your WSL 2 distro, and Visual Studio will stop execution at the breakpoint. You can see the output of your program (in this case, `"Hello CMake."`) in the Linux Console Window: +15. Select **Debug** > **Start**, or press **F5**. Your project builds, the executable launches on your WSL 2 distro, and Visual Studio halts execution at the breakpoint. The output of your program (in this case, `"Hello CMake."`) is visible in the Linux Console Window: - ![Linux console window, displaying the text "Hello Cmake." Also shows the sample program with a breakpoint on the line following cout << "Hello CMake".](media/walkthrough-build-debug-wsl2-breakpoint.png) + :::image type="complex" source="media/walkthrough-build-debug-wsl2-breakpoint.png" alt-text="Screenshot of a running hello world program."::: + The Visual Studio Linux console window displays the output of the program: 'Hello C Make.' The editor window shows the hello world program. Execution stopped at a breakpoint on the line that says return 0;." + :::image-end::: You've now built and debugged a C++ app with WSL 2 and Visual Studio 2022. @@ -106,11 +113,11 @@ Visual Studio only provides native support for WSL 2 for CMake projects that use If you're targeting a WSL 2 distribution and you don't want to use the WSL 2 toolset, then in the Visual Studio Remote Settings vendor map in `CMakePresets.json`, set **forceWSL1Toolset** to **true** . For more information, see [Visual Studio Remote Settings vendor map](cmake-presets-json-reference.md#visual-studio-remote-settings-vendor-map). -If **forceWSL1Tooslet** is set to **true**, then Visual Studio won't maintain a copy of your source files in the WSL file system. Instead, it will access source files in the mounted Windows drive (`/mnt/`…). +If **forceWSL1Tooslet** is set to **true**, then Visual Studio doesn't maintain a copy of your source files in the WSL file system. Instead, it accesses source files in the mounted Windows drive (`/mnt/`…). In most cases, it's best to use the WSL 2 toolset with WSL 2 distributions because WSL 2 is slower when project files are instead stored in the Windows file system. To learn more about file system performance in WSL 2, see [Comparing WSL 1 and WSL 2](/windows/wsl/compare-versions). -Specify advanced settings such as the path to the directory on WSL 2 where the project will be copied, copy source options, and rsync command arguments, in the Visual Studio Remote Settings vendor map in `CMakePresets.json`. For more information, see [Visual Studio Remote Settings vendor map](cmake-presets-json-reference.md#visual-studio-remote-settings-vendor-map). +Specify advanced settings such as the path to the directory on WSL 2 where the project is copied, copy source options, and rsync command arguments, in the Visual Studio Remote Settings vendor map in `CMakePresets.json`. For more information, see [Visual Studio Remote Settings vendor map](cmake-presets-json-reference.md#visual-studio-remote-settings-vendor-map). System headers are still automatically copied to the Windows file system to supply the native IntelliSense experience. You can customize the headers that are included or excluded from this copy in the Visual Studio Remote Settings vendor map in `CMakePresets.json`. @@ -124,9 +131,9 @@ But you may have a MSBuild-based Linux project. If you have a MSBuild-based Linux project, then you can upgrade to the WSL 2 toolset in Visual Studio. Right-click the project in the solution explorer, then choose **Properties** > **General** > **Platform Toolset**: -![A screenshot of a dropdown with Platform Toolset selected, and to the right, another dropdown with WSL2 Toolset selected.](media/wsl-platform-toolset-selection.png) +:::image type="content" source="media/wsl-platform-toolset-selection.png" alt-text="Screenshot of a Visual Studio dropdown with Platform Toolset selected, and to the right, another dropdown with WSL2 Toolset selected."::: -If you're targeting a WSL 2 distribution and you don't want to use the WSL 2 toolset, then in the **Platform Toolset** dropdown, select the **GCC for Windows Subsystem for Linux** or **Clang for Windows Subsystem for Linux** toolset. If either of these toolsets are selected, Visual Studio won't maintain a copy of your source files in the WSL file system and will instead access source files over the mounted Windows drive (`/mnt/`…). System headers are still automatically copied to the Windows file system to provide a native IntelliSense experience. Customize the headers that are included or excluded from this copy in **Property Pages** > **General**. +If you're targeting a WSL 2 distribution and you don't want to use the WSL 2 toolset, then in the **Platform Toolset** dropdown, select the **GCC for Windows Subsystem for Linux** or **Clang for Windows Subsystem for Linux** toolset. If either of these toolsets are selected, Visual Studio doesn't maintain a copy of your source files in the WSL file system and instead accesses source files over the mounted Windows drive (`/mnt/`…). System headers are still automatically copied to the Windows file system to provide a native IntelliSense experience. Customize the headers that are included or excluded from this copy in **Property Pages** > **General**. In most cases, it's best to use the WSL 2 toolset with WSL 2 distributions because WSL 2 is slower when project files are stored in the Windows file system. To learn more, see [Comparing WSL 1 and WSL 2](/windows/wsl/compare-versions). diff --git a/docs/build/working-with-project-properties.md b/docs/build/working-with-project-properties.md index 9a6b533a192..8cd9eae55a3 100644 --- a/docs/build/working-with-project-properties.md +++ b/docs/build/working-with-project-properties.md @@ -3,29 +3,32 @@ title: "Set C++ compiler and build properties in Visual Studio" description: "Use the Visual Studio IDE to change C++ compiler and linker options and other build settings." ms.date: "07/17/2019" helpviewer_keywords: ["project properties [C++], modifying", "properties [C++]", "Visual C++ projects, properties", "projects [C++], properties"] -ms.assetid: 9b0d6f8b-7d4e-4e61-aa75-7d14944816cd --- # Set compiler and build properties -In the IDE, all information that's needed to build a project is exposed as *properties*. This information includes the application name, extension (such as DLL, LIB, EXE), compiler options, linker options, debugger settings, custom build steps, and many other things. Typically, you use *property pages* to view and modify these properties. To access the property pages, choose **Project** > **_project-name_ Properties** from the main menu, or right-click on the project node in **Solution Explorer** and choose **Properties**. +In the IDE, properties expose the information needed to build a project. This information includes the application name, extension (such as DLL, LIB, EXE), compiler options, linker options, debugger settings, custom build steps, and many other things. Typically, you use *property pages* to view and modify these properties. To access the property pages, choose **Project** > **_project-name_ Properties** from the main menu, or right-click on the project node in **Solution Explorer** and choose **Properties**. ## Default properties When you create a project, the system assigns values for various properties. The defaults vary somewhat depending on the kind of project and what options you choose in the app wizard. For example, an ATL project has properties related to MIDL files, but these properties are absent in a basic console application. The default properties are shown in the General pane in the Property Pages: -![Screenshot of the Property Pages dialog with the Project Defaults properties highlighted.](media/visual-c---project-defaults.png "Visual C++ project Defaults") +:::image type="complex" source="media/visual-c---project-defaults.png" alt-text="Screenshot of the Visual Studio project properties dialog."::: +The General page is open. The Project Defaults section is highlighted, which includes Configuration Type set to Application (.exe), use of MFC set to Use standard Windows libraries, Character set is Unicode, Common Language Runtime Support is set to No Common Language Runtime Support, Whole Program optimization is set to No Whole Program Optimization, and Windows Store APP support is set to No. +:::image-end::: ## Applying properties to build configurations and target platforms -Some properties, such as the application name, apply to all build variations and target platforms, whether it's a debug or release build. But most properties are configuration-dependent. To generate the correct code, the compiler has to know both the specific platform the program will run on and which specific compiler options to use. So when you set a property, it's important to pay attention to which configuration and platform the new value should apply to. Should it apply only to Debug Win32 builds, or should it also apply to Debug ARM64 and Debug x64? For example, the **Optimization** property, by default, is set to **Maximize Speed (/O2)** in a Release configuration, but it's disabled in the Debug configuration. +Some properties, such as the application name, apply to all build variations and target platforms, whether it's a debug or release build. But most properties are configuration-dependent. To generate the correct code, the compiler has to know both the specific platform the program runs on and which specific compiler options to use. So when you set a property, it's important to pay attention to which configuration and platform the new value should apply to. Should it apply only to Debug Win32 builds, or should it also apply to Debug ARM64 and Debug x64? For example, the **Optimization** property, by default, is set to **Maximize Speed (/O2)** in a Release configuration, but is disabled in the Debug configuration. -You can always see and change the configuration and platform a property value should apply to. The following illustration shows the property pages with the configuration and platform information controls at the top. When the **Optimization** property is set here, it will apply only to Debug Win32 builds, the currently active configuration, as shown by the red arrows. +You can always see and change the configuration and platform a property value should apply to. The following illustration shows the property pages with the configuration and platform information controls at the top. When the **Optimization** property is set here, it only applies to Debug Win32 builds, the currently active configuration, as shown by the red arrows. -![Screenshot of the Property Pages dialog showing property values for the currently active configuration.](media/visual-c---property-pages-showing-active-configuration.png "Visual C++ Property Pages showing active configuration") +:::image type="complex" source="media/visual-c---property-pages-showing-active-configuration.png" alt-text="Screenshot of the Visual Studio Property Pages dialog."::: +The page is open to C/C++, Optimization. The Optimization setting is set to Disabled (/Od), which is called out. An arrow calls out the relationship between the Configuration setting in the project property page, which is set to Active(Debug), and the setting in the Solution configuration dropdown on the toolbar, which is set to Debug. Another arrow calls out the relationship between the Platform setting in the project property page, which is set to Active(Win32), and the setting in the Solutions platform dropdown on the toolbar, which is set to x86. +:::image-end::: The following illustration shows the same project property page, but the configuration has been changed to Release. Note the different value for the Optimization property. Also note that the active configuration is still Debug. You can set properties for any configuration here; it doesn't have to be the active one. -![Screenshot of the Property Pages dialog showing property values for the release configuration.](media/visual-c---property-pages-showing-release-config.png "Visual C++ Property Pages showing release config") +:::image type="content" source="media/visual-c---property-pages-showing-release-config.png" alt-text="Screenshot of the Visual Studio project Property Pages dialog. The Configuration dropdown is called out and is set to Release. The C/C++ > Optimization > Optimization setting is set to Maximize Speed (/O2)."::: ## Target platforms @@ -42,7 +45,7 @@ For more information about setting properties for a Debug build, see: ## C++ compiler and linker options -C++ compiler and linker options are located under the **C/C++** and **Linker** nodes in the left pane under **Configuration Properties**. These options translate directly to command-line options that will be passed to the compiler. To read documentation about a specific option, select the option in the center pane and press **F1**. Or, you can browse documentation for all the options at [MSVC compiler options](reference/compiler-options.md) and [MSVC linker options](reference/linker-options.md). +C++ compiler and linker options are located under the **C/C++** and **Linker** nodes in the left pane under **Configuration Properties**. These options translate directly to command-line options that are passed to the compiler. To read documentation about a specific option, select the option in the center pane and press **F1**. Or, you can browse documentation for all the options at [MSVC compiler options](reference/compiler-options.md) and [MSVC linker options](reference/linker-options.md). The **Property Pages** dialog box shows only the property pages that are relevant to the current project. For example, if the project doesn't have an *`.idl`* file, the MIDL property page isn't displayed. For more information about the settings on each property page, see [Property Pages (C++)](reference/property-pages-visual-cpp.md). @@ -52,7 +55,9 @@ MSBuild supports the use of compile-time constants for certain string values, su The following illustration shows the property pages for a Visual Studio C++ project. In the left pane, the **VC++ Directories** *rule* is selected, and the right pane lists the properties that are associated with that rule. The property values are often macros, such as `$(VC_SourcePath)`: -![Screenshot of the Property Pages dialog showing the VC project directories.](media/project_property_pages_vc.png "Project_Property_Pages_VC") +:::image type="complex" source="media/project_property_pages_vc.png" alt-text="Screenshot of the Visual Studio Property Pages dialog for rules for various directories."::: +The VC plus plus Directories page is open, which has properties for the VC++ Directories rules. An example rule is Source directories, which is set to $(VC_SourcePath). There are rules for the include directories, library directories, executable directories, and so on. +:::image-end::: You can use the [Property Editor](#property_editor) to view the values of all available macros. @@ -62,7 +67,7 @@ You can use the [Property Editor](#property_editor) to view the values of all av Global macros apply to all items in a project configuration. A global macro has the syntax `$(name)`. An example of a global macro is `$(VCInstallDir)`, which stores the root directory of your Visual Studio installation. A global macro corresponds to a `PropertyGroup` in MSBuild. - **Item macros**\ - Item macros have the syntax `%(name)`. For a file, an item macro applies only to that file—for example, you can use `%(AdditionalIncludeDirectories)` to specify include directories that apply only to a particular file. This kind of item macro corresponds to an `ItemGroup` metadata in MSBuild. When it's used in the context of a project configuration, an item macro applies to all files of a certain type. For example, the C/C++ **Preprocessor Definitions** configuration property can take a `%(PreprocessorDefinitions)` item macro that applies to all .cpp files in the project. This kind of item macro corresponds to an `ItemDefinitionGroup` metadata in MSBuild. For more information, see [Item Definitions](/visualstudio/msbuild/item-definitions). + Item macros have the syntax `%(name)`. For a file, an item macro applies only to that file—for example, you can use `%(AdditionalIncludeDirectories)` to specify include directories that apply only to a particular file. This kind of item macro corresponds to an `ItemGroup` metadata in MSBuild. When used in the context of a project configuration, an item macro applies to all files of a certain type. For example, the C/C++ **Preprocessor Definitions** configuration property can take a `%(PreprocessorDefinitions)` item macro that applies to all .cpp files in the project. This kind of item macro corresponds to an `ItemDefinitionGroup` metadata in MSBuild. For more information, see [Item Definitions](/visualstudio/msbuild/item-definitions). ### User-defined macros @@ -82,11 +87,15 @@ A user-defined macro is stored in a property sheet. If your project doesn't alre You can use the Property Editor to modify certain string properties and select macros as values. To access the Property Editor, select a property on a property page and then choose the down arrow button on the right. If the drop-down list contains **\**, then you can choose it to display the Property Editor for that property. -![A property drop-down control is used to access the Property Editor.](media/property_editor_dropdown.png "Property Editor dropdown") +:::image type="complex" source="media/property_editor_dropdown.png" alt-text="Screenshot of the Visual Studio project properties page for VC plus plus Directories."::: +The Property Editor for the Include Directories setting is open. It shows the evaluated value for the Include Directories, which is C:\Program Files(x86)\Microsoft Visual Studio 14.0\VC\Include. It shows the two inherited values: $(VC_IncludePath) and $(WindowsSDK_IncludePath). A checkbox for 'Inherit from parent or project defaults' is selected. +:::image-end::: In the Property Editor, you can choose the **Macros** button to view the available macros and their current values. The following illustration shows the Property Editor for the **Additional Include Directories** property after the **Macros** button was chosen. When the **Inherit from parent or project defaults** check box is selected and you add a new value, it's appended to any values that are currently being inherited. If you clear the check box, your new value replaces the inherited values. In most cases, leave the check box selected. -![The Property Editor dialog for the Include Directories property.](media/propertyeditorvc.png "PropertyEditorVC") +:::image type="complex" source="media/propertyeditorvc.png" alt-text="Screenshot of the Property Editor dialog after selecting the Macros button."::: +The property editor for Include Directories is open. The evaluated value is displayed along with the inherited values. A listbox contains various macros and their values, such as $(CharacterSet) which is set to Unicode. +:::image-end::: ## Add an include directory to the set of default directories diff --git a/docs/cpp/how-to-create-and-use-shared-ptr-instances.md b/docs/cpp/how-to-create-and-use-shared-ptr-instances.md index 51794d39a4d..e98a1a28931 100644 --- a/docs/cpp/how-to-create-and-use-shared-ptr-instances.md +++ b/docs/cpp/how-to-create-and-use-shared-ptr-instances.md @@ -4,15 +4,16 @@ title: "How to: Create and use shared_ptr instances" ms.custom: "how-to" ms.date: "05/26/2023" ms.topic: "conceptual" -ms.assetid: 7d6ebb73-fa0d-4b0b-a528-bf05de96518e --- # How to: Create and Use shared_ptr instances -The `shared_ptr` type is a smart pointer in the C++ standard library that is designed for scenarios in which more than one owner might have to manage the lifetime of the object in memory. After you initialize a `shared_ptr` you can copy it, pass it by value in function arguments, and assign it to other `shared_ptr` instances. All the instances point to the same object, and share access to one "control block" that increments and decrements the reference count whenever a new `shared_ptr` is added, goes out of scope, or is reset. When the reference count reaches zero, the control block deletes the memory resource and itself. +The `shared_ptr` type is a smart pointer in the C++ standard library that is designed for scenarios in which more than one owner needs to manage the lifetime of an object. After you initialize a `shared_ptr` you can copy it, pass it by value in function arguments, and assign it to other `shared_ptr` instances. All the instances point to the same object, and share access to one "control block" that increments and decrements the reference count whenever a new `shared_ptr` is added, goes out of scope, or is reset. When the reference count reaches zero, the control block deletes the memory resource and itself. The following illustration shows several `shared_ptr` instances that point to one memory location. -![Shared pointer diagram.](media/shared_ptr.png "Shared pointer diagram") +:::image type="complex" source="media/shared_ptr.png" alt-text="Diagram showing two shared_ptr instances pointing to one memory location."::: +The first diagram shows a shared pointer, P1, that points to a MyClass instance as well as a control block with ref count = 1. The second diagram shows the addition of another shared pointer, P2, which also points to the MyClass instance and to the shared control block, which now has a ref count of 2. +:::image-end::: ## Example setup @@ -73,7 +74,7 @@ Whenever possible, use the [make_shared](../standard-library/memory-functions.md ## Example 2 -The following example shows how to declare and initialize `shared_ptr` instances that take on shared ownership of an object that has already been allocated by another `shared_ptr`. Assume that `sp2` is an initialized `shared_ptr`. +The following example shows how to declare and initialize `shared_ptr` instances that take on shared ownership of an object that was allocated by another `shared_ptr`. Assume that `sp2` is an initialized `shared_ptr`. [!code-cpp[stl_smart_pointers#2](codesnippet/CPP/how-to-create-and-use-shared-ptr-instances_2.cpp)] @@ -85,7 +86,7 @@ The following example shows how to declare and initialize `shared_ptr` instances ## Example 4 -You can use `dynamic_pointer_cast`, `static_pointer_cast`, and `const_pointer_cast` to cast a `shared_ptr`. These functions resemble the **`dynamic_cast`**, **`static_cast`**, and **`const_cast`** operators. The following example shows how to test the derived type of each element in a vector of `shared_ptr` of base classes, and then copy the elements and display information about them. +You can use `dynamic_pointer_cast`, `static_pointer_cast`, and `const_pointer_cast` to cast a `shared_ptr`. These functions resemble the **`dynamic_cast`**, **`static_cast`**, and **`const_cast`** operators. The following example shows how to test the derived type of each element in a vector of `shared_ptr` of base classes, and then copies the elements and display information about them. [!code-cpp[stl_smart_pointers#4](codesnippet/CPP/how-to-create-and-use-shared-ptr-instances_4.cpp)] @@ -101,7 +102,7 @@ You can pass a `shared_ptr` to another function in the following ways: - When you're deciding how to pass a `shared_ptr`, determine whether the callee has to share ownership of the underlying resource. An "owner" is an object or function that can keep the underlying resource alive for as long as it needs it. If the caller has to guarantee that the callee can extend the life of the pointer beyond its (the function's) lifetime, use the first option. If you don't care whether the callee extends the lifetime, then pass by reference and let the callee copy it or not. -- If you have to give a helper function access to the underlying pointer, and you know that the helper function will just use the pointer and return before the calling function returns, then that function doesn't have to share ownership of the underlying pointer. It just has to access the pointer within the lifetime of the caller's `shared_ptr`. In this case, it's safe to pass the `shared_ptr` by reference, or pass the raw pointer or a reference to the underlying object. Passing this way provides a small performance benefit, and may also help you express your programming intent. +- If you have to give a helper function access to the underlying pointer, and you know that the helper function uses the pointer and return before the calling function returns, then that function doesn't have to share ownership of the underlying pointer. It just has to access the pointer within the lifetime of the caller's `shared_ptr`. In this case, it's safe to pass the `shared_ptr` by reference, or pass the raw pointer or a reference to the underlying object. Passing this way provides a small performance benefit, and may also help you express your programming intent. - Sometimes, for example in a `std::vector>`, you may have to pass each `shared_ptr` to a lambda expression body or named function object. If the lambda or function doesn't store the pointer, then pass the `shared_ptr` by reference to avoid invoking the copy constructor for each element. diff --git a/docs/get-started/tutorial-console-cpp.md b/docs/get-started/tutorial-console-cpp.md index 7b2b7421b4d..8db834984f3 100644 --- a/docs/get-started/tutorial-console-cpp.md +++ b/docs/get-started/tutorial-console-cpp.md @@ -14,29 +14,31 @@ The usual starting point for a C++ programmer is a "Hello, world!" application t ## Prerequisites -- Have Visual Studio with the **Desktop development with C++** workload installed and running on your computer. If it's not installed yet, see [Install C++ support in Visual Studio](../build/vscpp-step-0-installation.md). +- Have Visual Studio with the **Desktop development with C++** workload installed and running on your computer. If it's not installed, see [Install C++ support in Visual Studio](../build/vscpp-step-0-installation.md). - This tutorial demonstrates a feature called edit and continue which allows you to make changes to your code while the app is running. To ensure that edit and continue can function for this article, from the main menu choose **Tools** > **Options** > **Debugging** > **General** and ensure that **Require source files to exactly match the original version** is checked. ## Create your app project Visual Studio uses *projects* to organize the code for an app, and *solutions* to organize your projects. A project contains all the options, configurations, and rules used to build your apps. It also manages the relationship between all the project's files and any external files. To create your app, first, create a new project and solution. -1. If you've started Visual Studio, the Visual Studio Start dialog box appears. Choose **Create a new project** to get started. +1. Start Visual Studio and the Visual Studio Start dialog box appears. Choose **Create a new project** to get started. - ![Screenshot of the Visual Studio 2022 initial dialog with options such as create a new project, open an existing project, and more.](./media/calc-vs2022-initial-dialog.png) + :::image type="complex" source="./media/calc-vs2022-initial-dialog.png" alt-text="Screenshot of dialog that appears when Visual Studio 2022 starts."::: + The dialog has options to clone a repository, open a project or solution, open a local folder, and create a new project." + :::image-end::: Otherwise, on the menubar in Visual Studio, choose **File** > **New** > **Project**. The **Create a new project** window opens. 1. In the list of project templates, choose **Console App**, then choose **Next**. - ![Screenshot of the Create a new project dialog, with the Console App template selected.](./media/calc-vs2019-choose-console-app.png "Choose the Console App template") + :::image type="content" source="./media/calc-vs2019-choose-console-app.png" alt-text="Screenshot of the Visual Studio Create a new project dialog. The Console App template option is highlighted."::: > [!Important] > Make sure you choose the C++ version of the **Console App** template. It has the **C++**, **Windows**, and **Console** tags, and the icon has "++" in the corner. 1. In the **Configure your new project** dialog box, select the **Project name** edit box, name your new project *CalculatorTutorial*, then choose **Create**. - ![Screenshot of the Configure your new project dialog, which has fields for the project name, project location, and so on.](./media/calc-vs2019-name-your-project.png "Name your project in the Configure your new project dialog") + :::image type="content" source="./media/calc-vs2019-name-your-project.png" alt-text="Screenshot of the Visual Studio Configure your new project dialog. It has fields for project name, project location, and Solution name."::: An empty C++ Windows console application gets created. Console applications use a Windows console window to display output and accept user input. In Visual Studio, an editor window opens and shows the generated code: @@ -69,11 +71,11 @@ The template for a new Windows console application creates a simple C++ "Hello W 1. To build your project, choose **Build Solution** from the **Build** menu. The **Output** window shows the results of the build process. - ![Screenshot of the Visual Studio Output window showing the result of the build.](./media/calc-vs2019-build-your-project.png "Build the project") + :::image type="content" source="./media/calc-vs2019-build-your-project.png" alt-text="Screenshot of the Visual Studio Output window. It is displaying a message that the build succeeded."::: 1. To run the code, on the menu bar, choose **Debug**, **Start without debugging**. - ![Screenshot of the Visual Studio Debug Console showing the output: "Hello World!"](./media/calc-vs2019-hello-world-console.png "Run the project") + :::image type="content" source="./media/calc-vs2019-hello-world-console.png" alt-text="Screenshot of the Visual Studio Debug Console displaying the output of the application: Hello World!."::: A console window opens and then runs your app. When you start a console app in Visual Studio, it runs your code, then prints "Press any key to close this window . . ." to give you a chance to see the output. Congratulations! You've created your first "Hello, world!" console app in Visual Studio! @@ -136,13 +138,17 @@ It's time to add some math logic. 1. Go to the **Project** menu and choose **Add Class**. In the **Class Name** edit box, enter *Calculator*. Choose **OK**. Two new files get added to your project. To save all your changed files at once, press **Ctrl+Shift+S**. It's a keyboard shortcut for **File** > **Save All**. There's also a toolbar button for **Save All**, an icon of two floppy disks, found beside the **Save** button. In general, it's good practice to do **Save All** frequently, so you don't miss any files when you save. - ![Screenshot of the Add Class dialog box with Calculator typed in the Class Name text box.](./media/calc-vs2019-create-calculator-class.png "Create the Calculator class") + :::image type="complex" source="./media/calc-vs2019-create-calculator-class.png" alt-text="Screenshot of the Visual Studio Add Class dialog box."::: + The class name field is set to calculator. The .h file field contains Calculator.h. The .cpp file field contains Calculator.cpp. The base class field is empty. Other options for virtual destructor, inline, and unmanaged are unchecked. + :::image-end::: A class is like a blueprint for an object that does something. In this case, we define a calculator and how it should work. The **Add Class** wizard you used previously created `.h` and `.cpp` files that have the same name as the class. You can see a full list of your project files in the **Solution Explorer** window, visible on the side of the IDE. If the window isn't visible, you can open it from the menu bar: choose **View** > **Solution Explorer**. - ![Screenshot of the Visual Studio 2019 Solution Explorer window displaying the Calculator Tutorial project.](./media/calc-vs2019-solution-explorer.png "Solution Explorer") + :::image type="complex" source="./media/calc-vs2019-solution-explorer.png" alt-text="Screenshot of the Visual Studio Solution Explorer window."::: + The calculator tutorial project has a header files node containing Calculator.h. A Source Files node contains Calculator.cpp and CalculatorTutorial.cpp. Nodes for references, external dependencies, and resource files are visible but closed. + :::image-end::: You should now have three tabs open in the editor: *`CalculatorTutorial.cpp`*, *`Calculator.h`*, and *`Calculator.cpp`*. If you accidentally close one of them, you can reopen it by double-clicking it in the **Solution Explorer** window. @@ -165,11 +171,13 @@ It's time to add some math logic. 1. A green squiggle appears under `Calculate` because we haven't defined the `Calculate` function in the `.cpp` file. Hover over `Calculate`, click the down arrow on the screwdriver that appears, and choose **Create definition of 'Calculate' in `Calculator.cpp`**. - ![Screenshot of Visual Studio showing a tool tip dropdown with Create definition of Calculate in Calculator C P P highlighted.](./media/calc-vs2019-create-definition.png "Create definition of Calculate") + :::image type="content" source="./media/calc-vs2019-create-definition.png" alt-text="Screenshot of a screwdriver dropdown in the Visual Studio editor window. The option 'Create definition of Calculate in Calculator.cpp' is highlighted."::: A pop-up appears that gives you a peek of the code change that was made in the other file. The code was added to *`Calculator.cpp`*. - !["Screenshot of a pop-up displaying the definition of Calculate."](./media/calc-vs2019-pop-up-definition.png) + :::image type="complex" source="./media/calc-vs2019-pop-up-definition.png" alt-text="Screenshot of a pop-up window in the Visual Studio editor showing the definition of the 'Calculate' ctor function."::: + The definition of the constructor is: double Calculator::Calculate( double x, char oper, double y) { return 0.0; } + :::image-end::: Currently, it just returns 0.0. Let's change that. Press **Esc** to close the pop-up. @@ -259,7 +267,9 @@ Now it's time to test the program again to make sure everything works properly. 1. Enter `5+5`, and press **Enter**. Verify that the result is 10. - ![Screenshot showing a command line with this output: "Result of 5+5 is: 10".](./media/calc-vs2019-five-plus-five.png "Screenshot of the Visual Studio Debug Console.") + :::image type="complex" source="./media/calc-vs2019-five-plus-five.png" alt-text="Screenshot of a command window showing the results of running the program."::: + The app output the message: Please enter the operation to perform. Format: a+b | a-b | a*b | a/b. The user entered 5+5. The app output: Result of 5+5 is: 10 + :::image-end::: ## Debug the app @@ -269,29 +279,33 @@ Since the user is free to type anything into the console window, let's make sure 1. Set a breakpoint on the `result = c.Calculate(x, oper, y);` line. To set the breakpoint, click next to the line in the gray vertical bar along the left edge of the editor window. A red dot appears. - ![Screenshot of Visual Studio with a red dot representing a breakpoint to the left of the line: result = c.Calculate(x, oper, y).](./media/calc-vs2019-set-breakpoint.png "Set a breakpoint.") + :::image type="content" source="./media/calc-vs2019-set-breakpoint.png" alt-text="Screenshot of the Visual Studio editor. A red dot representing a breakpoint appears on the line: result = c.Calculate(x, oper, y)."::: Now when we debug the program, it always pauses execution at that line. We already have a rough idea that the program works for simple cases. Since we don't want to pause execution every time, let's make the breakpoint conditional. 1. Right-click the red dot that represents the breakpoint, and choose **Conditions**. In the edit box for the condition, enter `(y == 0) && (oper == '/')`. Choose the **Close** button when you're done to save the breakpoint condition. - ![Screenshot of Visual Studio showing the Breakpoint Settings pop up and the condition y==0 && oper == '/' for the Is true value.](./media/calc-vs2019-conditional-breakpoint.png "Set a conditional breakpoint") + :::image type="complex" source="./media/calc-vs2019-conditional-breakpoint.png" alt-text="Screenshot of Visual Studio displaying the Breakpoint Settings pop-up." + The condition for the breakpoint is: y==0 && oper == '/' Is true. + :::image-end::: Now we pause execution at the breakpoint specifically if a division by 0 is attempted. 1. To debug the program, press **F5**, or choose the **Local Windows Debugger** toolbar button that has the green arrow icon. In your console app, if you enter something like "5 - 0", the program behaves normally and keeps running. However, if you type "10 / 0", it pauses at the breakpoint. You can even put any number of spaces between the operator and numbers: `cin` is smart enough to parse the input appropriately. - ![Screenshot of Visual Studio showing the program paused at the conditional breakpoint on the line: result = c.Calculate(x, oper, y);.](./media/calc-vs2019-debug-breakpoint.png "Pause at the conditional breakpoint") + :::image type="content" source="./media/calc-vs2019-debug-breakpoint.png" alt-text="Screenshot of Visual Studio editor. Program execution halted at the conditional breakpoint on the line: result = c.Calculate(x, oper, y);."::: ### Useful windows in the debugger Whenever you debug your code, you may notice that some new windows appear. These windows can assist your debugging experience. Take a look at the **Autos** window. The **Autos** window shows you the current values of variables used at least three lines before and up to the current line. To see all of the variables from that function, switch to the **Locals** window. You can modify the values of these variables while debugging, to see what effect they would have on the program. In this case, we leave them alone. - ![Screenshot of the Visual Studio Locals window showing the values of local variables.](./media/calc-vs2019-debug-locals.png "The Locals window") + :::image type="complex" source="./media/calc-vs2019-debug-locals.png" alt-text="Screenshot of the Locals window in Visual Studio, displaying the current values of local variables while debugging."::: + The value of oper is 47 '/', result is 0, x is 10, and y is 0. + :::image-end::: -You can also just hover over variables in the code itself to see their current values where the execution is currently paused. Make sure the editor window is in focus by clicking on it first. +You can also hover over variables in the code to see their current values where the execution is currently paused. Make sure the editor window is in focus by clicking on it first. - ![Screenshot of a tooltip displaying the value of the variable oper, which is the character `/`.](./media/calc-vs2019-hover-tooltip.png "Hover to view current variable values") + :::image type="content" source="./media/calc-vs2019-hover-tooltip.png" alt-text="Screenshot of a tooltip showing the value of the variable 'oper', which is 47 or '/'."::: ### To continue debugging @@ -303,9 +317,11 @@ You can also just hover over variables in the code itself to see their current v It looks like the program is doing what is expected: it takes the first number, and divides it by the second. On the `cout` line, hover over the `result` variable or take a look at `result` in the **Autos** window. Its value `inf`, which doesn't look right, so let's fix it. The `cout` line just outputs whatever value is stored in `result`, so when you step one more line forward using **F10**, the console window displays: - ![Screenshot of the Visual Studio Debug Console showing the result of dividing by zero, which is inf.](./media/calc-vs2019-divide-by-zero-fail.png "The result of divide by zero") + :::image type="complex" source="./media/calc-vs2019-divide-by-zero-fail.png" alt-text="Screenshot of a command window displaying the result of a division by zero."::: + The user entered 10 / 0. The program output: Result of 10/0 is: inf. + :::imnage-end::: - This result happens because division by zero is undefined, so the program doesn't have a numerical answer to the requested operation. + This result is because division by zero is undefined, so the program doesn't have a numerical answer for the requested operation. ### To fix the "divide by zero" error @@ -354,8 +370,8 @@ Let's handle division by zero more gracefully so that it's easier for the user t 1. Now press **F5** once. Program execution continues all the way until it has to pause to ask for user input. Enter `10 / 0` again. Now, a more helpful message is printed. The user is asked for more input, and the program continues executing normally. - :::image type="complex" source="./media/calc-vs2019-final-verification.png" alt-text="Screenshot of the Visual Studio Debug Console showing the final result after changes"::: - The console window displays two lines: 10 / 0 Result is: inf, followed by, 10 / 0 Division by 0 exception. + :::image type="complex" source="./media/calc-vs2019-final-verification.png" alt-text="Screenshot of a console window showing the final output after implementing changes to handle division by zero."::: + The console window displays two lines: 10 / 0 Result is: inf, followed by, 10 / 0 Math error: Attempted to divide by zero. :::image-end::: > [!Note] @@ -404,7 +420,7 @@ Visual Studio uses *projects* to organize the code for an app, and *solutions* t 3. In the **Name** edit box at the bottom, name the new project *CalculatorTutorial*, then choose **OK**. - ![Screenshot of the New Project dialog with the Windows Console Application project type selected and the Name text box set to CalculatorTutorial.](./media/calculator-new-project-dialog.png "The New Project dialog") + :::image type="content" source="./media/calculator-new-project-dialog.png" alt-text="Screenshot of the New Project dialog with the Windows Console Application project type selected and the Name text box set to CalculatorTutorial."::: An empty C++ Windows console application gets created. Console applications use a Windows console window to display output and accept user input. In Visual Studio, an editor window opens and shows the generated code: @@ -437,11 +453,11 @@ The template for a new windows console application creates a simple C++ "Hello W 1. To build your project, choose **Build Solution** from the **Build** menu. The **Output** window shows the results of the build process. - ![Screenshot of the Visual Studio Output window showing that the build was successful.](./media/calculator-initial-build-output.png "Build the project") + :::image type="content" source="./media/calculator-initial-build-output.png" alt-text="Screenshot of the Visual Studio Output window showing that the build was successful."::: 1. To run the code, on the menu bar, choose **Debug**, **Start without debugging**. - ![Screenshot of the Visual Studio Debug Console showing the output: Hello World!.](./media/calculator-hello-world-console.png "Start the project") + :::image type="content" source="./media/calculator-hello-world-console.png" alt-text="Screenshot of the Visual Studio Debug Console showing the output: Hello World!."::: A console window opens and then runs your app. When you start a console app in Visual Studio, it runs your code, then prints "Press any key to continue . . ." to give you a chance to see the output. Congratulations! You've created your first "Hello, world!" console app in Visual Studio! @@ -493,8 +509,8 @@ Now let's turn the code in this template into a calculator app. 1. To run the application, press **Ctrl+F5** or go to the **Debug** menu and choose **Start Without Debugging**. If you get a pop-up that says **This project is out of date**, you may select **Do not show this dialog again**, and then choose **Yes** to build your application. You should see a console window appear that displays the text specified in the code. - :::image type="complex" source="./media/calculator-first-launch.gif" alt-text="Short video of running the calculator app."::: - Short video showing Debug > Start without debugging. A dialog is visible that asks whether to build because the project is out of date. The checkbox for 'Do not show this dialog again' is selected. 'Yes' is selected to build the project, the calculator project builds, and then launches in a Windows console window. + :::image type="complex" source="./media/calculator-first-launch.gif" alt-text="Video showing the process of running the calculator app in the IDE."::: + First a dialog box appears that asks whether to build because the project is out of date. The checkbox for 'Do not show this dialog again' is selected. 'Yes' is selected to build the project, the calculator project builds, and then launches in a Windows console window. :::image-end::: 1. Close the console window when you're done. @@ -507,13 +523,15 @@ It's time to add some math logic. 1. Go to the **Project** menu and choose **Add Class**. In the **Class Name** edit box, enter *Calculator*. Choose **OK**. Two new files get added to your project. To save all your changed files at once, press **Ctrl+Shift+S**. It's a keyboard shortcut for **File** > **Save All**. There's also a toolbar button for **Save All**, an icon of two floppy disks, found beside the **Save** button. In general, it's good practice to do **Save All** frequently, so you don't miss any files when you save. - ![Short video showing the user opening the Add Class dialog box, typing Calculator in the Class Name field, and selecting O K.](./media/calculator-create-class.gif "Create the Calculator class") + :::image type="content" source="./media/calculator-create-class.gif" alt-text="Video showing the user opening the Add Class dialog box, typing 'Calculator' in the Class Name field, and clicking OK."::: A class is like a blueprint for an object that does something. In this case, we define a calculator and how it should work. The **Add Class** wizard you used previously created `.h` and `.cpp` files that have the same name as the class. You can see a full list of your project files in the **Solution Explorer** window, visible on the side of the IDE. If the window isn't visible, you can open it from the menu bar: choose **View** > **Solution Explorer**. - ![Screenshot of the Solution Explorer window displaying the Calculator Tutorial project.](./media/calculator-solution-explorer.png "Solution Explorer") + :::image type="complex" source="./media/calculator-solution-explorer.png" alt-text="Screenshot of the Visual Studio Solution Explorer window."::: + The calculator tutorial project has a header files node containing Calculator.h, stdafx.h, and targetver.h. A Source Files node contains Calculator.cpp, CalculatorTutorial.cpp, and stdafx.cpp. Nodes for references, external depndencies, and resource files are visible but closed. + :::image-end::: You should now have three tabs open in the editor: *`CalculatorTutorial.cpp`*, *`Calculator.h`*, and *`Calculator.cpp`*. If you accidentally close one of them, you can reopen it by double-clicking it in the **Solution Explorer** window. @@ -536,7 +554,7 @@ It's time to add some math logic. 1. A green squiggle appears under `Calculate` because we haven't defined the `Calculate` function in the `.cpp` file. Hover over `Calculate`, click the down arrow on the light bulb that appears, and choose **Create definition of 'Calculate' in `Calculator.cpp`**. A pop-up appears that gives you a peek of the code change that was made in the other file. The code was added to *`Calculator.cpp`*. - ![Short video showing the user selecting the Create definition of Calculate in Calculator C P P option.](./media/calculator-create-definition.gif "Create definition of Calculate") + :::image type="content" source="./media/calculator-create-definition.gif" alt-text="Video showing using the light bulb dropdown to select Create definition of Calculate in Calculator.cpp."::: Currently, it just returns 0.0. Let's change that. Press **Esc** to close the pop-up. @@ -625,7 +643,7 @@ Now it's time to test the program again to make sure everything works properly. 1. Enter `5+5`, and press **Enter**. Verify that the result is 10. - ![Screenshot of the Microsoft Visual Studio Debug Console showing the correct result of 5 + 5.](./media/calculator-five-plus-five.png "The result of 5 + 5") + :::image type="content" source="./media/calculator-five-plus-five.png" alt-text="Screenshot of a command window running the Calculator app. It shows that the result of 5 + 5 is 10."::: ## Debug the app @@ -635,35 +653,41 @@ Since the user is free to type anything into the console window, let's make sure 1. Set a breakpoint on the `result = c.Calculate(x, oper, y);` line. To set the breakpoint, click next to the line in the gray vertical bar along the left edge of the editor window. A red dot appears. - ![Short video of Visual Studio showing the user setting a breakpoint which creates a red dot to the left of the line of code.](./media/calculator-set-breakpoint.gif "Set a breakpoint") + :::image type="content" source="./media/calculator-set-breakpoint.gif" alt-text="Video showing the user setting a breakpoint on line 25: result = c.Calculate(x, oper, y);."::: Now when we debug the program, it always pauses execution at that line. We already have a rough idea that the program works for simple cases. Since we don't want to pause execution every time, let's make the breakpoint conditional. 1. Right-click the red dot that represents the breakpoint, and choose **Conditions**. In the edit box for the condition, enter `(y == 0) && (oper == '/')`. Choose the **Close** button when you're done to save the breakpoint condition. - :::image type="complex" source="./media/calculator-conditional-breakpoint.gif" alt-text="Set a conditional breakpoint"::: - Short video showing a right-click on the breakpoint. The breakpoint is on the line of code that reads result = c dot Calculate ( x, oper, y). 'Conditions...' is selected in the dropdown, which opens the breakpoint settings window. In the text box following the Conditional Expression and Is true dropdowns, the user enters y == 0 && oper == '/', and then selects close to set the conditional breakpoint. + :::image type="complex" source="./media/calculator-conditional-breakpoint.gif" alt-text="Video demonstrating the process of setting a conditional breakpoint."::: + The breakpoint is on the line: result = c dot Calculate ( x, oper, y). 'Conditions...' is selected in the breakpoint dropdown, which opens the breakpoint settings window. The Condition option is checked, underneath which the dropdowns are set as: 'Conditional Expression' and 'Is true'. The user enters y == 0 && oper == '/' into the condition textbox and then selects close to set the conditional breakpoint. :::image-end::: Now we pause execution at the breakpoint specifically if a division by 0 is attempted. 1. To debug the program, press **F5**, or choose the **Local Windows Debugger** toolbar button that has the green arrow icon. In your console app, if you enter something like "5 - 0", the program behaves normally and keeps running. However, if you type "10 / 0", it pauses at the breakpoint. You can even put any number of spaces between the operator and numbers; `cin` is smart enough to parse the input appropriately. - ![Short video showing the program paused at the conditional breakpoint.](./media/calculator-debug-conditional.gif "Pause at the conditional breakpoint") + :::image type="complex" source="./media/calculator-debug-conditional.gif" alt-text="Video showing the program execution paused at the conditional breakpoint."::: + The user enters 5 - 0. The app outputs: Result is 5. The user then enters 10/0 and because the condition for the conditional breakpoint is met, execution stops on the line: result = c.Calculate(x, oper, y); + :::image-end::: ### Useful windows in the debugger Whenever you debug your code, you may notice that some new windows appear. These windows can assist your debugging experience. Take a look at the **Autos** window. The **Autos** window shows you the current values of variables used at least three lines before and up to the current line. - ![Screenshot of the Autos window showing the values of c, oper, result, x, and y.](./media/calculator-autos.png "The Autos window") + :::image type="complex" source="./media/calculator-autos.png" alt-text="Screenshot of the Visual Studio debugger Autos window."::: + The value of oper is 47 '/', result is 5, x is 10, and y is 0. + :::image-end::: To see all of the variables from that function, switch to the **Locals** window. You can modify the values of these variables while debugging, to see what effect they would have on the program. In this case, we leave them alone. - ![Screenshot of the Locals window showing the values of the function's local variables.](./media/calculator-locals.png "The Locals window") + :::image type="complex" source="./media/calculator-locals.png" alt-text="Screenshot of the Visual Studio debugger Locals window."::: + The current values of the function's local variables are visible. The value of oper is 47 '/', result is 5, x is 10, and y is 0." + :::image-end::: -You can also just hover over variables in the code itself to see their current values where the execution is currently paused. Make sure the editor window is in focus by clicking on it first. +You can also hover over variables in the code itself to see their current values where the execution is currently paused. Make sure the editor window is in focus by clicking on it first. - ![Short video showing the tooltip that appears when you hover over a variable. The tooltip displays the variable's value.](./media/calculator-hover-tooltip.gif "Hover to view current variable values") + :::image type="content" source="./media/calculator-hover-tooltip.gif" alt-text="Video demonstrating a tooltip that appears while hovering over the variable y. It displays y's current value, which is 0."::: ### To continue debugging @@ -673,11 +697,15 @@ You can also just hover over variables in the code itself to see their current v 1. Continue using **F10** to **Step Over** each line until you get back to the `main()` function in the other file, and stop on the `cout` line. - ![Short video of stepping over lines in the Calculate function until back in main(). Then hovering over the result variable and seeing its value: inf.](./media/calculator-undefined-zero.gif "Step out of Calculate and check result") + :::image type="complex" source="./media/calculator-undefined-zero.gif" alt-text="Video showing stepping over each line of code in the Calculate function."::: + Each line of code in the Calculate function is stepped over until control returns to the main function. The user then hovers over the variable named result to see its value, which is: inf." + :::image-end::: It looks like the program is doing what is expected: it takes the first number, and divides it by the second. On the `cout` line, hover over the `result` variable or take a look at `result` in the **Autos** window. Its value is `inf`, which doesn't look right, so let's fix it. The `cout` line just outputs whatever value is stored in `result`, so when you step one more line forward using **F10**, the console window displays: - ![Screenshot of the Visual Studio Debug Console which shows the result of dividing by zero: inf](./media/calculator-divide-by-zero-fail.png "The result of divide by zero") + :::image type="complex" source="./media/calculator-divide-by-zero-fail.png" alt-text="Screenshot of the Visual Studio Debug Console displaying the result of a division by zero operation."::: + The app output: Please enter the operation to perform. Format: a+b | a-b | a*b | a/b. The user entered 5-0. The app output: Result is: 5. THe user entered 10/0. The app output: Result is: inf + :::image-end::: This result happens because division by zero is undefined, so the program doesn't have a numerical answer to the requested operation. @@ -728,7 +756,7 @@ Let's handle division by zero more gracefully, so a user can understand the prob 1. Now press **F5** once. Program execution continues all the way until it has to pause to ask for user input. Enter `10 / 0` again. Now, a more helpful message is printed. The user is asked for more input, and the program continues executing normally. - ![Short video of the Debug Console which shows the final result after changes. 10 / 0 is entered and the program displays: Division by 0 exception.](./media/calculator-final-verification.gif "The final result after changes") + :::image type="content" source="./media/calculator-final-verification.gif" alt-text="Video of the Debug Console showing the final result after code changes. 10 / 0 is entered and the program displays 'Division by 0 exception'."::: > [!Note] > When you edit code while in debugging mode, there is a risk of code becoming stale. This happens when the debugger is still running your old code, and has not yet updated it with your changes. The debugger pops up a dialog to inform you when this happens. Sometimes, you may need to press **F5** to refresh the code being executed. In particular, if you make a change inside a function while the point of execution is inside that function, step out of the function, then back into it again to get the updated code. If that doesn't work for some reason and you see an error message, you can stop debugging by clicking on the red square in the toolbar under the menus at the top of the IDE, then start debugging again by entering **F5** or by choosing the green "play" arrow beside the stop button on the toolbar. diff --git a/docs/linux/connect-to-your-remote-linux-computer.md b/docs/linux/connect-to-your-remote-linux-computer.md index 35781eeac14..e0c79a2daa2 100644 --- a/docs/linux/connect-to-your-remote-linux-computer.md +++ b/docs/linux/connect-to-your-remote-linux-computer.md @@ -25,7 +25,7 @@ You can configure a Linux project to target a remote machine or the Windows Subs ::: moniker range=">=msvc-150" -When using a remote connection, Visual Studio builds C++ Linux projects on the remote machine. It doesn't matter if it's a physical machine, a VM in the cloud, or WSL. +When using a remote connection, Visual Studio builds C++ Linux projects on the remote machine. It doesn't matter if it's a physical machine, a virtual machine in the cloud, or WSL. To build the project, Visual Studio copies the source code to your remote Linux computer. Then, the code gets compiled based on Visual Studio settings. ::: moniker-end @@ -64,11 +64,13 @@ If `ssh` isn't already set up and running on your Linux system, follow these ste 1. In the Connection Manager dialog, choose the **Add** button to add a new connection. - ![Screenshot showing the options pane and CrossPlatform > C plus plus > Connection Manager selected. The Add button is highlighted.](media/settings_connectionmanager.png) + :::image type="content" source="media/settings_connectionmanager.png" alt-text="Screenshot of the Visual Studio options pane. CrossPlatform > C++ > Connection Manager is selected and the Add button is highlighted."::: In either scenario, the **Connect to Remote System** window is displayed. - ![Screenshot showing the Connect to Remote System window which has fields for host name, port, user name, authentication type, and password.](media/connect.png) + :::image type="content" source="media/connect.png" alt-text="Screenshot of the Visual Studio Connect to Remote System window."::: + There are fields for host name, port, user name, authentication type, and password. Port is set to 22. Authentication type is set to 'Password'. + :::image-end::: 1. Enter the following information: @@ -84,7 +86,7 @@ If `ssh` isn't already set up and running on your Linux system, follow these ste You can use either a password or a key file and passphrase for authentication. For many development scenarios, password authentication is sufficient, but key files are more secure. If you already have a key pair, it's possible to reuse it. - Versions of Visual Studio before 17.10 support EC, RSA and DSA keys for remote connections. Because of security concerns, RSA and DSA keys are no longer supported in VS 17.10 and later. Only EC keys are currently supported. To create a key pair compatible with the connection manager use the command: + Versions of Visual Studio before 17.10 support EC, RSA, and DSA keys for remote connections. Because of security concerns, RSA and DSA keys are no longer supported in VS 17.10 and later. Only EC keys are currently supported. To create a key pair compatible with the connection manager use the command: `ssh-keygen -m pem -t ecdsa -f ` > [!NOTE] @@ -96,7 +98,7 @@ If `ssh` isn't already set up and running on your Linux system, follow these ste If the connection fails, the entry boxes that need to be changed are outlined in red. - ![Screenshot of the Connect to Remote System window with the host name and port fields outlined in red to indicate that they are incorrect.](media/settings_connectionmanagererror.png) + :::image type="content" source="media/settings_connectionmanagererror.png" alt-text="Screenshot of the Visual Studio Connect to Remote System window. The host name and port fields are outlined in red to indicate incorrect entries."::: If you use key files for authentication, make sure the target machine's SSH server is running and configured properly. @@ -108,11 +110,11 @@ If `ssh` isn't already set up and running on your Linux system, follow these ste ## Host key verification -In Visual Studio version 16.10 or later, you'll be asked to verify the server's host key fingerprint whenever Visual Studio connects to a remote system for the first time. You may be familiar with this process if you've used the OpenSSH command-line client or PuTTY before. The fingerprint identifies the server. Visual Studio uses the fingerprint to ensure it's connecting to the intended and trusted server. +In Visual Studio version 16.10 or later, you are asked to verify the server's host key fingerprint whenever Visual Studio connects to a remote system for the first time. You may be familiar with this process if you've used the OpenSSH command-line client or PuTTY before. The fingerprint identifies the server. Visual Studio uses the fingerprint to ensure it's connecting to the intended and trusted server. -The first time Visual Studio establishes a new remote connection, you'll be asked to accept or deny the host key fingerprint presented by the server. Or, anytime there are changes to a cached fingerprint. You can also verify a fingerprint on demand: select a connection in the Connection Manager and choose **Verify**. +The first time Visual Studio establishes a new remote connection, you are asked to accept or deny the host key fingerprint presented by the server. Or, anytime there are changes to a cached fingerprint. You can also verify a fingerprint on demand: select a connection in the Connection Manager and choose **Verify**. -If you upgrade to Visual Studio 16.10 or later from an older version, it treats any existing remote connections as new connections. You'll be prompted to accept the host key fingerprint first. Then, Visual Studio establishes a connection and caches the accepted fingerprint. +If you upgrade to Visual Studio 16.10 or later from an older version, it treats any existing remote connections as new connections. You are prompted to accept the host key fingerprint first. Then, Visual Studio establishes a connection and caches the accepted fingerprint. You can also update remote connections from `ConnectionManager.exe` using the `update` argument. @@ -131,11 +133,11 @@ Starting in Visual Studio version 16.9, support for older, insecure SSH algorith First, a little background. You can't select the SSH algorithm to use from Visual Studio. Instead, the algorithm is determined during the initial handshake with the SSH server. Each side (client and server) provides a list of algorithms it supports, and then the first algorithm common to both is selected. The connection succeeds as long as there's at least one algorithm in common between Visual Studio and the server for encryption, HMAC, key exchange, and so on. -The Open SSH configuration file (*`sshd_config`*) doesn't configure which algorithm to use by default. The SSH server should use secure defaults when no algorithms are specified. Those defaults depend on the version and vendor of the SSH server. If Visual Studio doesn't support those defaults, you'll likely see an error like: "Could not connect to the remote system. No common client to server HMAC algorithm was found." The error may also appear if the SSH server is configured to use algorithms that Visual Studio doesn't support. +The Open SSH configuration file (*`sshd_config`*) doesn't configure which algorithm to use by default. The SSH server should use secure defaults when no algorithms are specified. Those defaults depend on the version and vendor of the SSH server. If Visual Studio doesn't support those defaults, you'll likely see an error like: "Could not connect to the remote system. No common client to server HMAC algorithm was found." The error may also appear if the SSH server is configured to use algorithms that Visual Studio doesn't support. The default SSH server on most modern Linux distributions should work with Visual Studio. However, you may be running an older SSH server that's configured to use older, insecure algorithms. The following example explains how to update to more secure versions. -In the following example, the SSH server uses the insecure `hmac-sha1` algorithm, which isn't supported by Visual Studio 16.9. If the SSH server uses OpenSSH, you can edit the `/etc/ssh/sshd_config` file as shown below to enable more secure algorithms. For other SSH servers, refer to the server's documentation for how to configure them. +In the following example, the SSH server uses the insecure `hmac-sha1` algorithm, which Visual Studio 16.9 doesn't support. If the SSH server uses OpenSSH, you can edit the `/etc/ssh/sshd_config` file as shown below to enable more secure algorithms. For other SSH servers, refer to the server's documentation for how to configure them. First, verify that the set of algorithms your server is using includes algorithms supported by Visual Studio. Run the following command on the remote machine to list the algorithms supported by the server: @@ -155,7 +157,7 @@ ecdsa-sha2-nistp521-cert-v01@openssh.com sk-ecdsa-sha2-nistp256-cert-v01@openssh.com ``` -The output lists all the encryption, HMAC, key exchange, and host key algorithms supported by your SSH server. If the list doesn't include algorithms supported by Visual Studio, then you'll need to upgrade your SSH server before proceeding. +The output lists all the encryption, HMAC, key exchange, and host key algorithms supported by your SSH server. If the list doesn't include algorithms supported by Visual Studio, then upgrade your SSH server before proceeding. You can enable algorithms supported by Visual Studio by editing `/etc/ssh/sshd_config` on the remote machine. The following examples show how to add various types of algorithms to that configuration file. @@ -187,7 +189,9 @@ For example: `HostKeyAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384` You can enable logging to help troubleshoot connection problems. On the menu bar, select **Tools > Options**. In the **Options** dialog, select **Cross Platform > Logging**: - ![Screenshot of the Remote Logging screen with options to enable logging, log file location, and whether to log to the output window.](media/remote-logging-vs2019.png) + :::image type="complex" source="media/remote-logging-vs2019.png" alt-text="Screenshot of the Visual Studio options screen."::: + The options are open to Cross Platform > Connection Manager > Logging. Enable logging is checked, log to a file is checked, the logfile directory is set the documents folder, and log to the 'Cross Platform Logging' pane in the output window is checked. + :::image-end::: Logs include connections, all commands sent to the remote machine (their text, exit code and execution time), and all output from Visual Studio to the shell. Logging works for any cross-platform CMake project or MSBuild-based Linux project in Visual Studio. @@ -203,13 +207,15 @@ For example: `HostKeyAlgorithms ecdsa-sha2-nistp256,ecdsa-sha2-nistp384` ## TCP Port Forwarding -The `rsync` command is used by both MSBuild-based Linux projects and CMake projects to [copy headers from your remote system to Windows for use by IntelliSense](configure-a-linux-project.md#remote_intellisense). When you can't enable TCP port forwarding, disable the automatic download of remote headers. To disable it, use **Tools > Options > Cross Platform > Connection Manager > Remote Headers IntelliSense Manager**. If the remote system doesn't have TCP port forwarding enabled, you'll see this error when the download of remote headers for IntelliSense begins: +The `rsync` command is used by both MSBuild-based Linux projects and CMake projects to [copy headers from your remote system to Windows for use by IntelliSense](configure-a-linux-project.md#remote_intellisense). When you can't enable TCP port forwarding, disable the automatic download of remote headers. To disable it, use **Tools > Options > Cross Platform > Connection Manager > Remote Headers IntelliSense Manager**. If the remote system doesn't have TCP port forwarding enabled, this error appears when the download of remote headers for IntelliSense begins: -![Screenshot showing an error that the SSH channel couldn't be opened, and a path to log file for more details.](media/port-forwarding-headers-error.png) +:::image type="content" source="media/port-forwarding-headers-error.png" alt-text="Screenshot of a Visual Studio error message that the SSH channel couldn't be opened. The path to a log file is provided."::: -`rsync` is also used by Visual Studio's CMake support to copy source files to the remote system. If you can't enable TCP port forwarding, you can use `sftp` as your remote copy sources method. `sftp` is often slower than `rsync`, but doesn't have a dependency on TCP port forwarding. You can manage your remote copy sources method with the `remoteCopySourcesMethod` property in the [CMake Settings Editor](../build/cmakesettings-reference.md#settings-for-cmake-linux). If TCP port forwarding is disabled on your remote system, you'll see an error in the CMake output window the first time it invokes `rsync`. +`rsync` is also used by Visual Studio's CMake support to copy source files to the remote system. If you can't enable TCP port forwarding, you can use `sftp` as your remote copy sources method. `sftp` is often slower than `rsync`, but doesn't have a dependency on TCP port forwarding. You can manage your remote copy sources method with the `remoteCopySourcesMethod` property in the [CMake Settings Editor](../build/cmakesettings-reference.md#settings-for-cmake-linux). If TCP port forwarding is disabled on your remote system, an error appears in the CMake output window the first time it invokes `rsync`. -![Screenshot of the output window which shows an Rsync Error that the SSH channel couldn't be opened.](media/port-forwarding-copy-error.png) +:::image type="complex" source="media/port-forwarding-copy-error.png" alt-text="Screenshot of the Visual Studio output window displaying a Rsync Error message."::: +The output window includes these messages: Verify that TCP forwarding is enabled on the server, rsync: did not see server greeting, rsync error: error starting client-server protocol (code 5) at main.c(1675) [sender=3.1.3], An SSH channel couldn't be opened. +:::image-end::: `gdbserver` can be used for debugging on embedded devices. If you can't enable TCP port forwarding, then you must use `gdb` for all remote debugging scenarios. `gdb` is used by default when debugging projects on a remote system. diff --git a/docs/linux/media/remote-logging-vs2019.png b/docs/linux/media/remote-logging-vs2019.png index e2571dfe45bb6c8fdb106e3a610ba5c42fd2aef6..ccbea26f723a62a7740b7b782a37b8b973bd2bbf 100644 GIT binary patch literal 22910 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 literal 22905 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

l0U4H+6#ZgTH@8I0 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 MWlg1mTMzyJ2S(-|!2kdN