{"id":4251,"date":"2018-10-11T12:08:14","date_gmt":"2018-10-11T19:08:14","guid":{"rendered":"https:\/\/visualgdb.com\/w\/?p=4251"},"modified":"2018-10-11T12:08:14","modified_gmt":"2018-10-11T19:08:14","slug":"building-qt-projects-with-linux-cross-toolchains-and-msbuild","status":"publish","type":"post","link":"https:\/\/visualgdb.com\/tutorials\/linux\/qt\/msbuild\/cross\/","title":{"rendered":"Building Qt Projects with Linux Cross-toolchains and MSBuild"},"content":{"rendered":"<p>This tutorial shows how to use the MSBuild subsystem with VisualGDB to build Qt-based projects with Linux cross-toolchains. MSBuild provides better integration with Visual Studio than the\u00a0QMake build system and\u00a0allows finer-grain tweaking of various projects options. However,\u00a0as the Qt projects involve on several Qt-specific tools, using\u00a0MSBuild for them requires\u00a0a few manual configuration steps. This tutorial\u00a0provides a detailed description of those steps and explains the involved tools.<\/p>\n<p>Before you begin, install VisualGDB 5.4 or later.<\/p>\n<ol>\n<li>We will begin with creating a regular Qt project using the QMake build system. Open the VisualGDB Linux Project Wizard and pick the name and the location for your project:<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/01-newprj.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4252\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/01-newprj.png\" alt=\"01-newprj\" width=\"786\" height=\"547\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/01-newprj.png 786w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/01-newprj-300x209.png 300w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/01-newprj-392x272.png 392w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/01-newprj-130x90.png 130w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/><\/a><\/li>\n<li>On the first page of the wizard select &#8220;Create a new project&#8221; -&gt; &#8220;Application&#8221; -&gt; &#8220;Qt&#8221; and pick your Qt version:<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/02-qt5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4253\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/02-qt5.png\" alt=\"02-qt5\" width=\"886\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/02-qt5.png 886w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/02-qt5-300x235.png 300w\" sizes=\"(max-width: 886px) 100vw, 886px\" \/><\/a><\/li>\n<li>On the next page select your cross-toolchain and the target machine:<br \/>\n<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/03-raspi.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4254\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/03-raspi.png\" alt=\"03-raspi\" width=\"886\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/03-raspi.png 886w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/03-raspi-300x235.png 300w\" sizes=\"(max-width: 886px) 100vw, 886px\" \/><\/a><\/li>\n<li>Press &#8220;Finish&#8221;. VisualGDB will\u00a0install the Qt packages on the target and will\u00a0copy them inside the cross-toolchain. Once the toolchain is ready,\u00a0VisualGDB will create a basic Qt project. Build it\u00a0via Ctrl-Shift-B and ensure it\u00a0succeeds:<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/04-build.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4255\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/04-build.png\" alt=\"04-build\" width=\"977\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/04-build.png 977w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/04-build-300x213.png 300w\" sizes=\"(max-width: 977px) 100vw, 977px\" \/><\/a>Take a note of the build log as it will contain important command\u00a0line arguments that we will copy into MSBuild files later. You can find a sample build log using the Raspberry Pi toolchain <a href=\"https:\/\/github.com\/sysprogs\/tutorials\/blob\/master\/visualgdb\/Linux\/QtMSBuild-Cross\/CommandLines.txt\">here<\/a>.<\/li>\n<li>The project is currently built using the QMake tool that uses its own set of makefiles not directly mapped to Visual Studio targets.\u00a0Converting the project to MSBuild will\u00a0let Visual Studio control the build process, improving the build time and letting you\u00a0create additional targets (e.g. libraries) and tweak per-file properties. Start the conversion\u00a0by selecting &#8220;Convert Project to MSBuild&#8221; in the context menu:<br \/>\n<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/05-convert.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4256\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/05-convert.png\" alt=\"05-convert\" width=\"977\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/05-convert.png 977w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/05-convert-300x213.png 300w\" sizes=\"(max-width: 977px) 100vw, 977px\" \/><\/a><\/li>\n<li>VisualGDB will\u00a0create a new &#8220;VisualGDB&#8221; platform in the project (and solution) and will copy basic project properties\u00a0to it. However, this process won&#8217;t automatically convert the implicit properties defined\u00a0by the QMake tool, so attempting to build the project will result in an error:<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/06-error.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4257\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/06-error.png\" alt=\"06-error\" width=\"977\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/06-error.png 977w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/06-error-300x213.png 300w\" sizes=\"(max-width: 977px) 100vw, 977px\" \/><\/a><\/li>\n<li>Instead of storing\u00a0the Qt-specific properties directly in the project file, we will create a reusable property sheet file that can be referenced from other projects to instantly\u00a0add Qt support to them. Open View-&gt;Other Windows-&gt;Property Manager and create a new property sheet:<br \/>\n<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/07-propsheet.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4258\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/07-propsheet.png\" alt=\"07-propsheet\" width=\"977\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/07-propsheet.png 977w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/07-propsheet-300x213.png 300w\" sizes=\"(max-width: 977px) 100vw, 977px\" \/><\/a><\/li>\n<li>Save the property sheet in a location where\u00a0it can be referenced by other similar projects:<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/08-name.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4259\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/08-name.png\" alt=\"08-name\" width=\"786\" height=\"547\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/08-name.png 786w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/08-name-300x209.png 300w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/08-name-392x272.png 392w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/08-name-130x90.png 130w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/><\/a><\/li>\n<li>Locate the &#8220;g++&#8221; command line for the MainWindow.cpp file in the original build log and also locate the final link command line. Then make a list of the following parameters from the command line:<br \/>\n<table>\n<tbody>\n<tr>\n<td>Parameter<\/td>\n<td>Syntax<\/td>\n<td>Relevant MSBuild field<\/td>\n<\/tr>\n<tr>\n<td>Include search path<\/td>\n<td>-I&lt;directory&gt; or -isystem &lt;directory&gt;<\/td>\n<td>ClCompile.AdditionalIncludeDirectories<\/td>\n<\/tr>\n<tr>\n<td>Preprocessor definitions<\/td>\n<td>-D&lt;definition&gt;<\/td>\n<td>ClCompile.PreprocessorDefinitions<\/td>\n<\/tr>\n<tr>\n<td>Library search directories<\/td>\n<td>-L&lt;directory&gt;<\/td>\n<td>Link.LibrarySearchDirectories<\/td>\n<\/tr>\n<tr>\n<td>Additional library names<\/td>\n<td>-l&lt;library&gt;<\/td>\n<td>Link.AdditionalLibraryNames<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Note that you can\u00a0replace the toolchain&#8217;s sysroot path\u00a0with just the &#8216;=&#8217; symbol, e.g.\u00a0<strong>-IC:\/SysGCC\/raspberry\/arm-linux-gnueabihf\/sysroot\/usr\/include\/arm-linux-gnueabihf\/qt5<\/strong> can be simplified to just <strong>=\/usr\/include\/arm-linux-gnueabihf\/qt5<\/strong>.<\/li>\n<li>Enter the extracted command-line options in the corresponding fields of the .props file you created. In our example the props file will look as follows:\n<pre class=\"\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt; \r\n&lt;Project ToolsVersion=\"4.0\" xmlns=\"http:\/\/schemas.microsoft.com\/developer\/msbuild\/2003\"&gt;\r\n  &lt;ImportGroup Label=\"PropertySheets\" \/&gt;\r\n  &lt;PropertyGroup Label=\"UserMacros\" \/&gt;\r\n  &lt;PropertyGroup \/&gt;\r\n  &lt;ItemDefinitionGroup&gt;\r\n    &lt;ClCompile&gt;\r\n      &lt;AdditionalIncludeDirectories&gt;%(ClCompile.PreprocessorDefinitions);=\/usr\/lib\/arm-linux-gnueabihf\/qt5\/mkspecs\/arm-linux-gnueabihf;.;=\/usr\/include\/arm-linux-gnueabihf\/qt5;=\/usr\/include\/arm-linux-gnueabihf\/qt5\/QtWidgets;=\/usr\/include\/arm-linux-gnueabihf\/qt5\/QtGui;=\/usr\/include\/arm-linux-gnueabihf\/qt5\/QtCore;$(IntDir)&lt;\/AdditionalIncludeDirectories&gt;\r\n      &lt;PreprocessorDefinitions&gt;%(ClCompile.PreprocessorDefinitions);_REENTRANT;QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB&lt;\/PreprocessorDefinitions&gt;\r\n      &lt;PositionIndependentCode&gt;true&lt;\/PositionIndependentCode&gt;\r\n      &lt;\/ClCompile&gt;\r\n    &lt;Link&gt;\r\n      &lt;LibrarySearchDirectories&gt;%(Link.LibrarySearchDirectories);=\/usr\/X11R6\/lib64&lt;\/LibrarySearchDirectories&gt;\r\n      &lt;AdditionalLibraryNames&gt;%(Link.AdditionalLibraryNames);Qt5Widgets;Qt5Gui;Qt5Core;GLESv2;pthread&lt;\/AdditionalLibraryNames&gt;\r\n    &lt;\/Link&gt;\r\n  &lt;\/ItemDefinitionGroup&gt;\r\n  &lt;ItemGroup \/&gt;\r\n&lt;\/Project&gt;<\/pre>\n<p>It is also recommended to replace the hardcoded &#8220;Debug&#8221; path with &#8220;$(IntDir)&#8221; to\u00a0allow automatically changing it\u00a0when switching between debug and release configurations<\/li>\n<li>Try building your project. The build will now fail due to the missing ui_mainWindow.h file:<br \/>\n<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/09-missing.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4260\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/09-missing.png\" alt=\"09-missing\" width=\"977\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/09-missing.png 977w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/09-missing-300x213.png 300w\" sizes=\"(max-width: 977px) 100vw, 977px\" \/><\/a>This happens because we have not yet created the\u00a0rules for running the Qt UI compiler.<\/li>\n<li>Download the <a href=\"https:\/\/github.com\/sysprogs\/tutorials\/blob\/master\/visualgdb\/Linux\/QtMSBuild-Cross\/QtProjectItems.xml\">QtProjectItems.xml<\/a> file to your project directory. It will extend the Visual Studio file type system with 2 new types: <strong>Qt Header File<\/strong> and <strong>User Interface File<\/strong>.<\/li>\n<li>Edit the .props file to reference\u00a0QtProjectItems.xml:\n<pre class=\"\">\u00a0 &lt;ItemGroup&gt;\r\n\u00a0\u00a0 \u00a0&lt;PropertyPageSchema Include=\"$(MSBuildThisFileDirectory)\\QtProjectItems.xml\"\/&gt;\r\n\u00a0 &lt;\/ItemGroup&gt;<\/pre>\n<\/li>\n<li>Reopen the\u00a0solution and change the item type for MainWindow.h to <strong>Qt Header File<\/strong> and MainWindow.ui to <strong>User Interface File<\/strong>:<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/10-qhdr.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4261\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/10-qhdr.png\" alt=\"10-qhdr\" width=\"838\" height=\"597\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/10-qhdr.png 838w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/10-qhdr-300x214.png 300w\" sizes=\"(max-width: 838px) 100vw, 838px\" \/><\/a><\/li>\n<li>MSBuild builds the projects by creating a list of targets (possibly depending on other targets) and building them in sequence.\u00a0Each target may run one or more tools. We will now create a target for running the Qt\u00a0User Interface Compiler\u00a0(UIC) and Meta-Object Compiler (MOC). Add the following lines to the .props file:\n<pre class=\"\">\u00a0 &lt;PropertyGroup&gt;\r\n\u00a0\u00a0 \u00a0&lt;ClCompileDependsOn&gt;$(ClCompileDependsOn);InvokeQtTools&lt;\/ClCompileDependsOn&gt;\r\n\u00a0\u00a0 \u00a0&lt;BuildCppObjectListDependsOn&gt;$(BuildCppObjectListDependsOn);InvokeQtTools&lt;\/BuildCppObjectListDependsOn&gt;\r\n\u00a0 &lt;\/PropertyGroup&gt;\r\n\u00a0 &lt;Target Name=\"InvokeQtTools\" DependsOnTargets=\"PrepareForBuild;BeginRemoteBuild\"&gt;\r\n    &lt;!-- Specific tool invocations will go here --&gt;\u00a0\u00a0 \u00a0\r\n\u00a0 &lt;\/Target&gt;<\/pre>\n<\/li>\n<li>Add the\u00a0rules for invoking the MOC and UIC tools using the arguments captured from the original build log. E.g.:\n<pre class=\"\">&lt;GenericGNUTool \r\n    Sources=\"@(QtHeaderFile)\" \r\n    ToolPath=\"$(ToolchainDir)\\Qt\\v5\"\r\n    ToolchainPrefix=\"\"\r\n    ExtraPath=\"$(GNUToolchainExtraPath)\"\r\n    VisualGDBSettingsFile=\"$(VisualGDBSettingsFile)\"\r\n    TargetPath=\"$(TargetPath)\"\r\n    ToolExeNameBase=\"moc\"\r\n    ResponseFileTag=\"moc\"\r\n    PrimaryOutput=\"$(IntDir)moc_%(QtHeaderFile.FileName).cpp\"\r\n    CommandFormat=\"-DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I$(ToolchainDir)\/sysroot\/usr\/lib\/arm-linux-gnueabihf\/qt5\/mkspecs\/arm-linux-gnueabihf -IC:\/tutorials\/visualgdb\/Linux\/QtMSBuild-Cross -I$(ToolchainDir)\/sysroot\/usr\/include\/arm-linux-gnueabihf\/qt5 -I$(ToolchainDir)\/sysroot\/usr\/include\/arm-linux-gnueabihf\/qt5\/QtWidgets -I$(ToolchainDir)\/sysroot\/usr\/include\/arm-linux-gnueabihf\/qt5\/QtGui -I$(ToolchainDir)\/sysroot\/usr\/include\/arm-linux-gnueabihf\/qt5\/QtCore -I$(ToolchainDir)\/include\/c++\/6 -I$(ToolchainDir)\/include\/c++\/6\/backward -Ic:\/sysgcc\/raspberry\/lib\/gcc\/arm-linux-gnueabihf\/6\/include -Ic:\/sysgcc\/raspberry\/lib\/gcc\/arm-linux-gnueabihf\/6\/include-fixed -I$(ToolchainDir)\/include -I$(ToolchainDir)\/include\/arm-linux-gnueabihf\/c++\/6 -I$(ToolchainDir)\/sysroot\/usr\/include\/arm-linux-gnueabihf -I$(ToolchainDir)\/sysroot\/usr\/include\"\r\n    NonRSPArguments=\"$^ -o $@\"\r\n    AdditionalOptions=\"\"\r\n    FastUpToDateCheckDatabaseFile=\"$(FastUpToDateCheckDatabaseFile)\"\r\n    RepeatForEachSource=\"true\"\r\n    RemoteBuildMakefile=\"$(RemoteBuildMakefile)\"\r\n \/&gt; \r\n\r\n&lt;GenericGNUTool Condition=\"'@(UserInterfaceFile)'!=''\"\r\n    Sources=\"@(UserInterfaceFile)\" \r\n    ToolPath=\"$(ToolchainDir)\\Qt\\v5\"\r\n    ToolchainPrefix=\"\"\r\n    ExtraPath=\"$(GNUToolchainExtraPath)\"\r\n    VisualGDBSettingsFile=\"$(VisualGDBSettingsFile)\"\r\n    TargetPath=\"$(TargetPath)\"\r\n    ToolExeNameBase=\"uic\"\r\n    ResponseFileTag=\"uic\"\r\n    PrimaryOutput=\"$(IntDir)ui_%(UserInterfaceFile.FileName).h\"\r\n    NonRSPArguments=\"$^ -o $@\"\r\n    CommandFormat=\" \"\r\n    AdditionalOptions=\"\"\r\n    FastUpToDateCheckDatabaseFile=\"$(FastUpToDateCheckDatabaseFile)\"\r\n    RepeatForEachSource=\"true\"\r\n    RemoteBuildMakefile=\"$(RemoteBuildMakefile)\"\r\n \/&gt;\r\n\r\n&lt;ItemGroup&gt;\r\n    &lt;ClCompile Include=\"$(IntDir)moc_%(QtHeaderFile.FileName).cpp\"\/&gt;\r\n&lt;\/ItemGroup&gt;\r\n<\/pre>\n<p>This will invoke the MOC and UIC tools for\u00a0the corresponding source files and will add the\u00a0files produced by the moc tool to the list of .cpp files to compile.<\/li>\n<li>Now you can build the project as usual:<br \/>\n<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/11-build.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4262\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/11-build.png\" alt=\"11-build\" width=\"977\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/11-build.png 977w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/11-build-300x213.png 300w\" sizes=\"(max-width: 977px) 100vw, 977px\" \/><\/a><\/li>\n<li>Press F5 to start debugging it and verify that it works:<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/12-hello.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4263\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/12-hello.png\" alt=\"12-hello\" width=\"977\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/12-hello.png 977w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/12-hello-300x213.png 300w\" sizes=\"(max-width: 977px) 100vw, 977px\" \/><\/a><\/li>\n<li>If you get a warning about including the FindComponents.props file multiple times, simply remove the explicit reference to it from the .vcxproj file. The MSBuild subsystem\u00a0will automatically include it when needed, so the explicit reference from the project file is not required:<br \/>\n<a href=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/13-warning.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4264\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/13-warning.png\" alt=\"13-warning\" width=\"977\" height=\"693\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/13-warning.png 977w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2018\/10\/13-warning-300x213.png 300w\" sizes=\"(max-width: 977px) 100vw, 977px\" \/><\/a><\/li>\n<li>Now you can reference the .props file you created from any other MSBuild-based project to automatically add Qt libraries to it.<\/li>\n<\/ol>\n<p>You can find the project shown in this tutorial, including\u00a0the final versions of all the files\u00a0in our <a href=\"https:\/\/github.com\/sysprogs\/tutorials\/tree\/master\/visualgdb\/Linux\/QtMSBuild-Cross\">tutorial repository on GitHub<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial shows how to use the MSBuild subsystem with VisualGDB to build Qt-based projects with Linux cross-toolchains. MSBuild provides<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[33,131,46,43],"_links":{"self":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/4251"}],"collection":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/comments?post=4251"}],"version-history":[{"count":1,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/4251\/revisions"}],"predecessor-version":[{"id":4266,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/4251\/revisions\/4266"}],"wp:attachment":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/media?parent=4251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/categories?post=4251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/tags?post=4251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}