Aracılığıyla paylaş


Visual Studio C++ Proje sistemi genişletilebilirliği ve derleme araçları tümleştirmesi

Visual C++ proje sistemi .vcxproj dosyaları için kullanılır. Visual Studio Ortak Proje Sistemi'ni (CPS) temel alır ve yeni MSBuild C++ proje sisteminin, derleme mimarilerinin ve hedef platformların kolay tümleştirilmesi için ek C++ özel genişletilebilirlik noktaları sağlar.

C++ MSBuild hedef yapısı

Tüm .vcxproj dosyaları şu dosyaları içeri aktarır:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

Bu dosyalar, kendi başlarına fazla tanımlama yapmaz. Bunun yerine, diğer dosyaları şu özellik değerlerine göre içeri aktarır:

  • $(ApplicationType)

    Örnekler: Windows Mağazası, Android, Linux

  • $(ApplicationTypeRevision)

    Bu, major.minor[.build[.revision]] formunun geçerli bir sürüm dizesi olmalıdır.

    Örnekler: 1.0, 10.0.0.0

  • $(Platform)

    "Tarihsel nedenlerden dolayı 'Platform' olarak adlandırılan inşa mimarisi."

    Örnekler: Win32, x86, x64, ARM

  • $(PlatformToolset)

    Örnekler: v140, v141, v141_xp, llvm

Bu özellik değerleri, $(VCTargetsPath) kök klasörünün altında klasör adlarını belirtir:

$(VCTargetsPath)\
     Uygulama Türü\
        $(ApplicationType)\
            $(ApplicationTypeRevision)\
                 Platformları\
                    $(Platform)\
                        PlatformToolsets
                            $(PlatformToolset)
     Platformları\
        $(Platform)\
            PlatformToolsets
                $(PlatformToolset)

$(VCTargetsPath) \ Platformları\ klasörü, Windows Masaüstü projeleri için $(ApplicationType) boş olduğunda kullanılır.

Yeni platform araç takımı ekleme

Mevcut Win32 platformu için "MyToolset" gibi yeni bir araç kümesi eklemek için, \Platforms\Win32\PlatformToolsets\bir $(VCTargetsPath) klasörü oluşturun ve Toolset.props ve Toolset.targets dosyaları oluşturun.

PlatformToolsets altındaki her klasör adı, Proje Özellikleri iletişim kutusunda belirtilen platform için kullanılabilir Platform Araç Takımı olarak görünür:

Proje Özellik Sayfaları iletişim kutusundaki Platform Araç Takımı özelliğini

Mevcut platform klasörlerinde bu araç takımını destekleyen benzer MyToolset klasörleri oluşturun ve Toolset.props ve Toolset.targets dosyalarını ekleyin.

Yeni platform ekleme

"Platformum" gibi yeni bir platform eklemek için, \Platforms\$(VCTargetsPath) klasörü oluşturun ve Platform.default.props, Platform.propsve Platform.targets dosyaları oluşturun. Ayrıca $(VCTargetsPath)\Platforms\MyPlatform\PlatformToolsets\ klasörünü oluşturun ve içinde en az bir araç takımı oluşturun.

Her ve $(ApplicationType) için $(ApplicationTypeRevision) klasörünün altındaki tüm klasör adları, IDE'de bir proje için Platform seçenekleri olarak görünür.

Yeni Proje Platformu iletişim kutusunda Yeni platform seçimi

Yeni uygulama türü ekleme

Yeni bir uygulama türü eklemek için, \Application Type\$(VCTargetsPath) klasörü oluşturun ve içinde bir Defaults.props dosyası oluşturun. Uygulama türü için en az bir düzeltme gerekir; bu nedenle $(VCTargetsPath)bir \Application Type\MyApplicationType\1.0 klasörü oluşturun ve içinde bir Defaults.props dosyası oluşturun. Ayrıca bir $(VCTargetsPath)\ApplicationType\MyApplicationType\1.0\Platforms klasörü oluşturmanız ve içinde en az bir platform oluşturmanız gerekir.

$(ApplicationType) ve $(ApplicationTypeRevision) özellikleri kullanıcı arabiriminde görünmez. Bunlar proje şablonlarında tanımlanır ve proje oluşturulduktan sonra değiştirilemez.

.vcxproj içeri aktarma ağacı

Microsoft C++ props ve targets dosyaları için basitleştirilmiş bir içeri aktarma ağacı şöyle görünür:

$(VCTargetsPath) \ Microsoft.Cpp.Default.props
     $(MSBuildExtensionsPath) \ $(MSBuildToolsVersion) \ Microsoft.Common.props
     $(VCTargetsPath) \ ImportBefore\Varsayılan\*.özellikler
     $(VCTargetsPath) \ Uygulama Türü\$(ApplicationType)\Default.props
     $(VCTargetsPath) \ Uygulama Türü\$(ApplicationType)\$(ApplicationTypeRevision)\Default.props
     $(VCTargetsPath) \ Uygulama Türü\$(ApplicationType)\$(ApplicationTypeRevision)\Platformlar\$(Platform)\Platform.default.props
     $(VCTargetsPath) \ ImportAfter\Varsayılan\*.props

Windows Masaüstü projeleri $(ApplicationType)tanımlamaz, bu nedenle yalnızca içeri aktarır

$(VCTargetsPath) \ Microsoft.Cpp.Default.props
     $(MSBuildExtensionsPath) \ $(MSBuildToolsVersion) \ Microsoft.Common.props
     $(VCTargetsPath) \ ImportBefore\Varsayılan\*.özellikler
     $(VCTargetsPath) \ Platformlar\$(Platform)\Platform.default.props
     $(VCTargetsPath) \ ImportAfter\Varsayılan\*.props

$(_PlatformFolder) platform klasörü konumlarını tutmak için $(Platform) özelliğini kullanacağız. Bu özellik

$(VCTargetsPath) \ Platformları\$(Platform)

Windows Masaüstü Uygulamaları için ve

$(VCTargetsPath) \ Uygulama Türü\$(ApplicationType)\$(ApplicationTypeRevision)\Platformları\$(Platform)

diğer her şey için.

Props dosyaları bu sıraya göre içeri aktarılır:

$(VCTargetsPath) \ Microsoft.Cpp.props
     $(_PlatformFolder) \ Platform.props
         $(VCTargetsPath) \ Microsoft.Cpp.Platform.props
             $(_PlatformFolder) \ ImportBefore\* .props
             $(_PlatformFolder) \ PlatformToolsets\$(PlatformToolset)\Toolset.props
            importAfter\* $(_PlatformFolder)\.props

Hedef dosyaları şu sırayla içeri aktarılır:

$(VCTargetsPath) \ Microsoft.Cpp.targets
     $(VCTargetsPath) \ Microsoft.Cpp.Current.targets
         $(_PlatformFolder) \ Platform.targets
             $(VCTargetsPath) \ Microsoft.Cpp.Platform.targets
                 $(_PlatformFolder) \ ImportBefore\* .hedefleri
                 $(_PlatformFolder) \ PlatformAraçTakımları\$(PlatformToolset)\AraçTakımı.target
                 $(_PlatformFolder) \ İçeri Aktar Sonra\*hedefleri

Araç takımınız için bazı varsayılan özellikler tanımlamanız gerekiyorsa, uygun ImportBefore ve ImportAfter klasörlerine dosya ekleyebilirsiniz.

Toolset.props ve Toolset.targets dosyalarını yazma

Toolset.props ve Toolset.targets dosyaları, bu araç takımı kullanıldığında derleme sırasında ne olacağı üzerinde tam denetime sahiptir. Ayrıca kullanılabilir hata ayıklayıcıları, Özellik Sayfaları iletişim kutusundaki içerik gibi bazı IDE kullanıcı arabirimini ve proje davranışının diğer bazı yönlerini de denetleyebilirler.

Bir araç takımı derleme işleminin tamamını geçersiz kılabilir ancak genellikle araç takımınızın bazı derleme adımlarını değiştirmesini veya eklemesini ya da mevcut derleme işleminin bir parçası olarak farklı derleme araçlarını kullanmasını istersiniz. Bu hedefe ulaşmak için, araç takımınızın içeri aktarabileceği bir dizi yaygın özellik ve hedef dosyası vardır. Araç takımınızın ne yapmak istediğinize bağlı olarak, bu dosyaları içeri aktarma veya örnek olarak kullanmak yararlı olabilir:

  • $(VCTargetsPath) \ Microsoft.CppCommon.targets

    Bu dosya, yerel derleme işleminin ana bölümlerini tanımlar ve ayrıca şunları içeri aktarır:

    • $(VCTargetsPath) \ Microsoft.CppBuild.targets

    • $(VCTargetsPath) \ Microsoft.BuildSteps.targets

    • $(MSBuildToolsPath) \ Microsoft.Common.Targets

  • $(VCTargetsPath) \ Microsoft.Cpp.Common.props

    Microsoft derleyicilerini kullanan ve Windows'u hedefleyen araç kümeleri için varsayılanları ayarlar.

  • $(VCTargetsPath) \ Microsoft.Cpp.WindowsSDK.props

    Bu dosya, Windows SDK'sının konumunu belirler ve Windows'ı hedefleyen uygulamalar için bazı önemli özellikleri tanımlar.

Araç kümesine özgü hedefleri varsayılan C++ derleme işlemiyle tümleştirme

Varsayılan C++ derleme işlemi Microsoft.CppCommon.targets içinde tanımlanır. Buradaki hedefler belirli bir derleme aracı çağırmaz; ana derleme adımlarını, bunların sırasını ve bağımlılıklarını belirtir.

C++ derlemesinde aşağıdaki hedefler tarafından temsil edilen üç ana adım vardır:

  • BuildGenerateSources

  • BuildCompile

  • BuildLink

Her derleme adımı bağımsız olarak yürütülebileceğinden, bir adımda çalışan hedefler farklı bir adımın parçası olarak çalışan hedeflerde tanımlanan öğe gruplarına ve özelliklere dayanamaz. Bu bölme, belirli yapı performansı iyileştirmelerine olanak tanır. Varsayılan olarak kullanılmasa da, bu ayrıma dikkat etmeniz konusunda yine de teşvik edilirsiniz.

Her adımda çalıştırılan hedefler şu özellikler tarafından denetlenmektedir:

  • $(BuildGenerateSourcesTargets)

  • $(BuildCompileTargets)

  • $(BeforeBuildLinkTargets)

Her adımda Önce ve Sonra özellikleri de vardır.

<Target
  Name="_BuildGenerateSourcesAction"
  DependsOnTargets="$(CommonBuildOnlyTargets);$(BeforeBuildGenerateSourcesTargets);$(BuildGenerateSourcesTargets);$(AfterBuildGenerateSourcesTargets)" />

<Target
  Name="\_BuildCompileAction"
  DependsOnTargets="$(CommonBuildOnlyTargets);$(BeforeBuildCompileTargets);$(BuildCompileTargets);$(AfterBuildCompileTargets)" />

<Target
  Name="\_BuildLinkAction"
  DependsOnTargets="$(CommonBuildOnlyTargets);$(BeforeBuildLinkTargets);$(BuildLinkTargets);$(AfterBuildLinkTargets)" />

Her adımda yer alan hedeflerin örnekleri için Microsoft.CppBuild.targets dosyasına bakın:

<BuildCompileTargets Condition="'$(ConfigurationType)'\!='Utility'">
  $(BuildCompileTargets);
  _ClCompile;
  _ResGen;
  _ResourceCompile;
  $(BuildLibTargets);
</BuildCompileTargets>

_ClCompilegibi hedeflere bakarsanız, bunların doğrudan kendi başlarına hiçbir şey yapmadıklarını, bunun yerine ClCompiledahil olmak üzere diğer hedeflere bağlı olduklarını görürsünüz:

<Target Name="_ClCompile"
  DependsOnTargets="$(BeforeClCompileTargets);$(ComputeCompileInputsTargets);MakeDirsForCl;ClCompile;$(AfterClCompileTargets)" >
</Target>

ClCompile ve diğer derleme aracına özgü hedefler, Microsoft.CppBuild.targetsiçinde boş hedefler olarak tanımlanır:

<Target Name="ClCompile"/>

ClCompile hedefi boş olduğundan, bir araç seti tarafından geçersiz kılınmadığı sürece gerçek derleme eylemi gerçekleştirilmez. Araç seti hedefleri, ClCompileiçeri aktarıldıktan sonra başka bir ClCompile tanımı içerebilir, yani hedefini geçersiz kılabilir:

<Target Name="ClCompile"
  Condition="'@(ClCompile)' != ''"
  DependsOnTargets="SelectClCompile">
  <!-- call some MSBuild tasks -->
</Target>

Visual Studio'nun platformlar arası desteği uygulamasından önce oluşturulan adına rağmen, ClCompile hedefinin CL.exe'i çağırması gerekmez. Ayrıca uygun MSBuild görevlerini kullanarak Clang, gcc veya diğer derleyicileri çağırabilir.

ClCompile hedefinin, tek dosya derleme komutunun IDE'de çalışması için gereken SelectClCompile hedefi dışında hiçbir bağımlılığı olmamalıdır.

Araç takımı hedeflerinde kullanılacak MSBuild görevleri

Gerçek bir derleme aracını çağırmak için hedefin bir MSBuild görevi çağırması gerekir. Çalıştırılacak bir komut satırı belirtmenize olanak tanıyan temel bir Exec görevi vardır. Ancak, derleme araçlarının genellikle artımlı derlemeleri izlemek için birçok seçeneği, girişi ve çıkışı vardır, bu nedenle bunlar için özel görevlere sahip olmak daha mantıklıdır. Örneğin, CL görevi MSBuild özelliklerini CL.exe anahtarlara çevirir, bunları bir yanıt dosyasına yazar ve CL.exeçağırır. Ayrıca sonraki artımlı derlemeler için tüm giriş ve çıkış dosyalarını izler. Daha fazla bilgi için bkz. Artımlı derlemeler ve up-to-tarih denetimleri.

Microsoft.Cpp.Common.Tasks.dll şu görevleri uygular:

  • BSCMake

  • CL

  • ClangCompile (clang-gcc anahtarları)

  • LIB

  • LINK

  • MIDL

  • Mt

  • RC

  • XDCMake

  • CustomBuild (Exec gibi ancak giriş ve çıkış izleme ile)

  • SetEnv

  • GetOutOfDateItems

Mevcut bir araçla aynı eylemi gerçekleştiren ve benzer komut satırı anahtarları (clang-cl ve CL gibi) olan bir aracınız varsa, her ikisi için de aynı görevi kullanabilirsiniz.

Derleme aracı için yeni bir görev oluşturmanız gerekiyorsa, aşağıdaki seçenekler arasından seçim yapabilirsiniz:

  1. Bu görevi nadiren kullanıyorsanız veya derlemeniz için birkaç saniye önemli değilse, MSBuild 'satır içi' görevlerini kullanabilirsiniz:

    • Xaml görevi (özel yapı kuralı)

      Bir Xaml görev bildirimi örneği için bkz. $(VCTargetsPath)\BuildCustomizations\masm.xmlve kullanımı için bkz. $(VCTargetsPath)\BuildCustomizations\masm.targets.

    • Kod Görev

  2. Daha iyi görev performansı istiyorsanız veya yalnızca daha karmaşık işlevlere ihtiyacınız varsa, normal MSBuild görev yazma işlemini kullanın.

    Aracın tüm girişleri ve çıkışları, CL, MIDLve RC olaylarında olduğu gibi araç komut satırında listelenmiyorsa ve otomatik giriş ve çıkış dosyası izleme ile .tlog dosyası oluşturmak istiyorsanız, görevinizi Microsoft.Build.CPPTasks.TrackedVCToolTask sınıfından türeyin. Şu anda temel ToolTask sınıfına yönelik belgeler olsa da, TrackedVCToolTask sınıfının ayrıntılarına yönelik bir örnek veya belge yoktur. Bu özellikle ilginizi çekerse, Geliştirici Topluluğu'nde bir isteğe sesinizi ekleyin.

Artımlı derlemeler ve up-to-tarih denetimleri

Varsayılan MSBuild artımlı derleme hedefleri Inputs ve Outputs özniteliklerini kullanır. Bunları belirtirseniz, MSBuild yalnızca girişlerden herhangi birinin tüm çıkışlardan daha yeni bir zaman damgasına sahip olması durumunda hedefi çağırır. Kaynak dosyalar genellikle diğer dosyaları içerdiğinden veya içeri aktardığından ve derleme araçları araç seçeneklerine bağlı olarak farklı çıkışlar ürettiğinden, MSBuild hedeflerindeki tüm olası girişleri ve çıkışları belirtmek zordur.

Bu sorunu yönetmek için C++ derlemesi artımlı derlemeleri desteklemek için farklı bir teknik kullanır. Hedeflerin çoğu giriş ve çıkış belirtmez ve sonuç olarak her zaman derleme sırasında çalışır. Hedefler tarafından çağrılan görevler, .tlog uzantısına sahip tlog dosyalarına tüm girişler ve çıkışlar hakkındaki bilgileri yazar. .tlog dosyaları, nelerin değiştiğini ve yeniden oluşturulması gerektiğini ve nelerin up-to-date olduğunu denetlemek için sonraki derlemeler tarafından kullanılır. .tlog dosyaları, IDE'de varsayılan derleme up-to-date denetimi için de tek kaynaktır.

Tüm giriş ve çıkışları belirlemek için yerel araç görevleri tracker.exe ve MSBuild tarafından sağlanan FileTracker sınıfını kullanır.

Microsoft.Build.CPPTasks.Common.dll TrackedVCToolTask genel soyut temel sınıfını tanımlar. Yerel araç görevlerinin çoğu bu sınıftan türetilir.

Visual Studio 2017 güncelleştirme 15.8'den başlayarak, Microsoft.Cpp.Common.Tasks.dll'de uygulanan GetOutOfDateItems görevini kullanarak bilinen giriş ve çıkışlara sahip özel hedefler için .tlog dosyaları oluşturabilirsiniz. Alternatif olarak, WriteLinesToFile görevini kullanarak da oluşturabilirsiniz. Örnek olarak _WriteMasmTlogs$(VCTargetsPath)\\ hedefini inceleyin.

.tlog dosyaları

Üç tür .tlog dosyası vardır: okuma, yazma ve komut satırı . .tlog dosyalarını okuma ve yazma, artımlı derlemeler ve IDE'deki up-to-date denetimi tarafından kullanılır. Komut satırı .tlog dosyaları yalnızca artımlı derlemelerde kullanılır.

MSBuild, .tlog dosyalarını okumak ve yazmak için şu yardımcı sınıfları sağlar:

FlatTrackingData sınıfı, hem okuma hem de yazma .tlog dosyalarına erişmek ve çıkışlardan daha yeni olan girişleri veya bir çıktının eksik olup olmadığını belirlemek için kullanılabilir. up-totarih denetiminde kullanılır.

Komut satırı .tlog dosyaları, derlemede kullanılan komut satırları hakkında bilgi içerir. Bunlar yalnızca artımlı derlemeler için kullanılır, up-totarih denetimleri için kullanılmaz, bu nedenle iç biçim bunları üreten MSBuild görevi tarafından belirlenir.

.tlog biçimini okuma

.tlog dosyaları (*.read.*.tlog) kaynak dosyalar ve bunların bağımlılıkları hakkında bilgi içerir.

Satırın başındaki şapka işareti (^) bir veya daha fazla kaynağı gösterir. Aynı bağımlılıkları paylaşan kaynaklar dikey çubukla (|) ayrılır.

Bağımlılık dosyaları kaynaklardan sonra listelenir ve her biri kendi satırında bulunur. Tüm dosya adları tam yol içerir.

Örneğin, proje kaynaklarınızın F:\test\ConsoleApplication1\ConsoleApplication1içinde bulunduğunu varsayalım. kaynak dosyanız Class1.cppvarsa, şunları içerir:

#include "stdafx.h" //precompiled header
#include "Class1.h"

ardından CL.read.1.tlog dosyası, kaynak dosyayı ve ardından iki bağımlılığını içerir:

^F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\CLASS1.CPP
F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.PCH
F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\CLASS1.H

Büyük harfle dosya adları yazmak gerekli değildir, ancak bazı araçlar için kolaylık sağlar.

.tlog biçimi yazma

Write .tlog (*.write.*.tlog) dosyaları kaynakları ve çıkışları bağlar.

Satırın başındaki şapka işareti (^) bir veya daha fazla kaynağı gösterir. Birden çok kaynak dikey çubukla (|) ayrılır.

Kaynaklardan oluşturulan çıkış dosyaları, kaynaklardan sonra ve her biri kendi satırında listelenmelidir. Tüm dosya adları tam yol olmalıdır.

Örneğin, Class1.cppek kaynak dosyası olan basit bir ConsoleApplication projesi için link.write.1.tlog dosyası şunları içerebilir:

^F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\DEBUG\CLASS1.OBJ|F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.OBJ|F:\TEST\CONSOLEAPPLICATION1\CONSOLEAPPLICATION1\DEBUG\STDAFX.OBJ
F:\TEST\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.ILK
F:\TEST\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.EXE
F:\TEST\CONSOLEAPPLICATION1\DEBUG\CONSOLEAPPLICATION1.PDB

Tasarım zamanında oluşturma

IDE'de .vcxproj projeleri, projeden ek bilgi almak ve çıkış dosyalarını yeniden oluşturmak için bir msbuild hedefleri kümesi kullanır. Bu hedeflerden bazıları yalnızca tasarım zamanı derlemelerinde kullanılır, ancak bunların çoğu hem normal derlemelerde hem de tasarım zamanı derlemelerinde kullanılır.

Tasarım zamanı derlemeleri hakkında genel bilgi için Tasarım zamanı derlemeleri için CPS belgelerine bakın. Bu belgeler yalnızca Visual C++ projeleri için kısmen geçerlidir.

Tasarım zamanı derleme belgelerinde belirtilen CompileDesignTime ve Compile hedefleri, hiçbir zaman .vcxproj projesi için çalışmaz. Visual C++ .vcxproj projeleri, IntelliSense bilgilerini almak için farklı tasarım zamanı hedefleri kullanır.

IntelliSense bilgileri için tasarım zamanı hedefleri

.vcxproj projelerinde kullanılan tasarım zamanı hedefleri,$(VCTargetsPath)\Microsoft.Cpp.DesignTime.targets içinde tanımlanır.

GetClCommandLines hedefi IntelliSense için derleyici seçeneklerini toplar:

<Target
  Name="GetClCommandLines"
  Returns="@(ClCommandLines)"
  DependsOnTargets="$(DesignTimeBuildInitTargets);$(ComputeCompileInputsTargets)">
  • DesignTimeBuildInitTargets – yalnızca tasarım zamanında hedeflenen, tasarım zamanı derleme başlatılması için gerekli öğeler. Diğer şeylerin yanı sıra, bu hedefler, performansı geliştirmek için bazı normal derleme işlevlerini devre dışı bırakır.

  • ComputeCompileInputsTargets: Derleyici seçeneklerini ve öğelerini değiştiren bir hedef kümesidir. Bu hedefler hem tasarım zamanında hem de normal derlemelerde çalışır.

Hedef, IntelliSense için kullanılacak komut satırını oluşturmak üzere CLCommandLine görevini çağırır. Adına rağmen, yalnızca CL seçeneklerini değil, Clang ve gcc seçeneklerini de işleyebilir. Derleyici anahtarlarının türü ClangMode özelliği tarafından denetlenmektedir.

Şu anda, CLCommandLine görevi tarafından üretilen komut satırı, IntelliSense motorunun ayrıştırmasının daha kolay olması nedeniyle her zaman CL anahtarlarını (Clang modunda dahi) kullanır.

Derlemeden önce (normal veya tasarım zamanı) çalışan bir hedef ekliyorsanız, bunun tasarım zamanı derlemelerini bozmadığından veya performansı etkilemediğinden emin olun. Hedefinizi test etmenin en basit yolu bir Geliştirici komut istemi açmak ve şu komutu çalıştırmaktır:

msbuild /p:SolutionDir=*solution-directory-with-trailing-backslash*;Configuration=Debug;Platform=Win32;BuildingInsideVisualStudio=true;DesignTimebuild=true /t:\_PerfIntellisenseInfo /v:d /fl /fileloggerparameters:PerformanceSummary \*.vcxproj

Bu komut, sonunda hedefler ve görevler için bir performans özeti içeren ayrıntılı bir derleme günlüğü msbuild.logoluşturur.

Condition ="'$(DesignTimeBuild)' != 'true'"'ı sadece normal derlemeler için anlamlı olan tüm işlemlerde kullandığınızdan emin olun; tasarım zamanı derlemeleri için kullanmayın.

Kaynak oluşturan tasarım zamanı hedefleri

Bu özellik Masaüstü yerel projeleri için varsayılan olarak devre dışıdır ve şu andaönbelleğe alınmış projelerde desteklenmez.

Proje öğesi için GeneratorTarget meta verileri tanımlanmışsa, hedef hem proje yüklendiğinde hem de kaynak dosya değiştirildiğinde otomatik olarak çalıştırılır.

Örneğin, .xaml dosyalarından otomatik olarak .cpp veya .h dosyaları oluşturmak için, $(VSInstallDir)\MSBuild\Microsoft\WindowsXaml\v16.0\*\Microsoft.Windows.UI.Xaml.CPP.Targets dosyaları şu varlıkları tanımlar:

<ItemDefinitionGroup>
  <Page>
    <GeneratorTarget>DesignTimeMarkupCompilation</GeneratorTarget>
  </Page>
  <ApplicationDefinition>
    <GeneratorTarget>DesignTimeMarkupCompilation</GeneratorTarget>
  </ApplicationDefinition>
</ItemDefinitionGroup>
<Target Name="DesignTimeMarkupCompilation">
  <!-- BuildingProject is used in Managed builds (always true in Native) -->
  <!-- DesignTimeBuild is used in Native builds (always false in Managed) -->
  <CallTarget Condition="'$(BuildingProject)' != 'true' Or $(DesignTimeBuild) == 'true'" Targets="DesignTimeMarkupCompilationCT" />
</Target>

Kaynak dosyaların kaydedilmemiş içeriğini almak için Task.HostObject kullanmak için hedefler ve görev, pkgdef içindeki belirli projeler için MsbuildHostObjects olarak kaydedilmelidir:

\[$RootKey$\\Projects\\{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\\MSBuildHostObjects\]
\[$RootKey$\\Projects\\{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\\MSBuildHostObjects\\DesignTimeMarkupCompilationCT;CompileXaml\]
@="{83046B3F-8984-444B-A5D2-8029DEE2DB70}"

Visual Studio IDE'de Visual C++ proje genişletilebilirliği

Visual C++ proje sistemi, VS Proje Sistemitemel alır ve genişletilebilirlik noktalarını kullanır. Ancak, proje hiyerarşisi uygulaması CPS'ye değil Visual C++'ya özgüdür, bu nedenle hiyerarşi genişletilebilirliği proje öğeleriyle sınırlıdır.

Proje özellik sayfaları

Genel tasarım bilgileri için bkz. VC++ Projeleri için Çoklu Hedefleme Çerçevesi.

Basit bir ifadeyle, bir C++ projesinin Proje Özellikleri iletişim kutusunda gördüğünüz özellik sayfaları, kural dosyaları tarafından tanımlanır. Kural dosyası, özellik sayfasında gösterilecek bir özellik kümesini ve bunların proje dosyasına nasıl ve nereye kaydedileceğini belirtir. Kural dosyaları, Xaml biçimini kullanan .xml dosyalardır. Bunları serileştirmek için kullanılan türler Microsoft.Build.Framework.XamlTypes içinde açıklanmıştır. Projelerde kural dosyalarının kullanımı hakkında daha fazla bilgi için bkz. Özellik Sayfası XML kural dosyaları.

Kural dosyalarının PropertyPageSchema öğe grubuna eklenmesi gerekir:

<ItemGroup>
  <PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\general.xml;"/>
  <PropertyPageSchema Include="$(VCTargetsPath)$(LangID)\general_file.xml">
    <Context>File</Context>
  </PropertyPageSchema>
</ItemGroup>

Context meta veriler, kural türü tarafından da denetlenen kural görünürlüğünü sınırlar ve şu değerlerden birine sahip olabilir:

Project | File | PropertySheet

CPS bağlam türü için diğer değerleri destekler, ancak Visual C++ projelerinde kullanılmaz.

Kuralın birden fazla bağlamda görünür olması gerekiyorsa, bağlam değerlerini ayırmak için burada gösterildiği gibi noktalı virgül (;) kullanın:

<PropertyPageSchema Include="$(MyFolder)\MyRule.xml">
  <Context>Project;PropertySheet</Context>
</PropertyPageSchema>

Kural biçimi ve ana türler

Kural biçimi basittir, bu nedenle bu bölüm yalnızca kuralın kullanıcı arabiriminde nasıl göründüğünü etkileyen öznitelikleri açıklar.

<Rule
  Name="ConfigurationGeneral"
  DisplayName="General"
  PageTemplate="generic"
  Description="General"
  xmlns="http://schemas.microsoft.com/build/2009/properties">

PageTemplate özniteliği, kuralın Özellik Sayfaları iletişim kutusunda nasıl görüntüleneceğini tanımlar. özniteliği şu değerlerden birine sahip olabilir:

Öznitelik Açıklama
generic Tüm özellikler Kategori başlıkları altında bir sayfada gösterilir
Kural, Project ve PropertySheet bağlamları için görünebilir, ancak Fileiçin görünmez.

Örnek: $(VCTargetsPath)\1033\general.xml
tool Kategoriler alt sayfa olarak gösterilir.
Kural tüm bağlamlarda görülebilir: Project, PropertySheet ve File.
Kural, yalnızca projede ItemTypeiçinde tanımlanmış Rule.DataSource olan öğeler varsa ve kural adı ProjectTools öğe grubuna dahil edilmediği sürece Proje Özellikleri'nde görünür.

Örnek: $(VCTargetsPath)\1033\clang.xml
debugger Sayfa, Hata Ayıklama sayfasının bir parçası olarak gösterilir.
Kategoriler şu anda yok sayılır.
Kural adı, Hata Ayıklama Başlatıcısı MEF nesnesinin ExportDebugger özniteliğiyle eşleşmelidir.

Örnek: $(VCTargetsPath)\1033\debugger_local_windows.xml
özel Özel şablon. Şablonun adı, ExportPropertyPageUIFactoryProvider MEF nesnesinin PropertyPageUIFactoryProvider özniteliğiyle eşleşmelidir. Bkz. Microsoft.VisualStudio.ProjectSystem.Designers.Properties.IPropertyPageUIFactoryProvider.

Örnek: $(VCTargetsPath)\1033\userMacros.xml

Kural, Property Grid tabanlı şablonlardan birini kullanıyorsa özellikleri için şu genişletilebilirlik noktalarını kullanabilir:

Kuralı genişlet

Var olan bir kuralı kullanmak istiyorsanız ancak yalnızca birkaç özellik eklemeniz veya kaldırmanız (yani gizlemeniz) gerekiyorsa, birUzantısı kuralı oluşturabilirsiniz.

Kuralı geçersiz kılma

Araç takımınızın proje varsayılan kurallarının çoğunu kullanmasını ancak yalnızca bir veya birkaçını değiştirmesini isteyebilirsiniz. Örneğin, yalnızca C/C++ kuralını farklı derleyici anahtarlarını gösterecek şekilde değiştirmek istediğinizi varsayalım. Mevcut kural ile aynı ada ve görünen ada sahip yeni bir kural sağlayabilir ve varsayılan cpp hedefleri aktarıldıktan sonra PropertyPageSchema öğe grubuna ekleyebilirsiniz. Projede belirli bir ada sahip tek bir kural kullanılır ve PropertyPageSchema öğe grubuna eklenen son kural kazanır.

Proje öğeleri

ProjectItemsSchema.xml dosyası, Proje Öğeleri olarak ele alınan Öğeler için ContentType ve ItemType değerlerini tanımlar ve yeni bir dosyanın hangi Öğe grubuna eklendiğini belirlemek için FileExtension öğeleri tanımlar.

Varsayılan ProjectItemsSchema dosyası $(VCTargetsPath)\1033\ProjectItemsSchema.xmliçinde bulunur. Genişletmek için, MyProjectItemsSchema.xmlgibi yeni bir ada sahip bir şema dosyası oluşturmanız gerekir:

<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties">

  <ItemType Name="MyItemType" DisplayName="C/C++ compiler"/>

  <ContentType
    Name="MyItems"
    DisplayName="My items"
    ItemType=" MyItemType ">
  </ContentType>

  <FileExtension Name=".abc" ContentType=" MyItems"/>

</ProjectSchemaDefinitions>

Ardından hedefler dosyasına şunları ekleyin:

<ItemGroup>
  <PropertyPageSchema Include="MyProjectItemsSchema.xml"/>
</ItemGroup>

Örnek: $(VCTargetsPath)\BuildCustomizations\masm.xml

Hata ayıklayıcı

Visual Studio'daki Hata Ayıklama hizmeti, Hata Ayıklama altyapısı için genişletilebilirliği destekler. Daha fazla bilgi için şu örneklere bakın:

Hata ayıklama oturumu için Hata ayıklama altyapılarını ve diğer özellikleri belirtmek için, bir Hata Ayıklama Başlatıcısı MEF bileşeni uygulamanız ve bir debugger kuralı eklemeniz gerekir. Bir örnek için $(VCTargetsPath)\1033\debugger_local_windows.xml dosyasına bakın.

Dağıtmak

.vcxproj projeleri, Dağıtım Sağlayıcılarıiçin Visual Studio Proje Sistemi genişletilebilirliğini kullanır.

Sürüm up-To-tarih kontrolü

Varsayılan olarak, derleme up-to-date denetimi, tüm derleme girişleri ve çıkışları için .tlog okuma ve yazma .tlog dosyalarının $(TlogLocation) klasöründe oluşturulmasını gerektirir.

Özel bir up-totarih denetimi yapmak için:

  1. NoVCDefaultBuildUpToDateCheckProvider dosyasına özelliğini ekleyerek varsayılan up-to-date denetimini devre dışı bırakın:

    <ItemGroup>
      <ProjectCapability Include="NoVCDefaultBuildUpToDateCheckProvider" />
    </ItemGroup>
    
  2. Kendi IBuildUpToDateCheckProvider'ınızı uygulayın.

Proje yükseltme

Varsayılan .vcxproj proje yükselticisi

Varsayılan .vcxproj proje yükselticisi PlatformToolset, ApplicationTypeRevision, MSBuild araç takımı sürümünü ve .NET Framework'leri değiştirir. Son ikisi her zaman Visual Studio sürüm varsayılanları olarak değiştirilir, ancak PlatformToolset ve ApplicationTypeRevision özel MSBuild özellikleri tarafından denetlenebilir.

Yükseltici, bir projenin yükseltilip yükseltilmeyeceğine karar vermek için şu ölçütleri kullanır:

  1. ApplicationType ve ApplicationTypeRevisiontanımlayan projeler için geçerli olandan daha yüksek düzeltme numarasına sahip bir klasör vardır.

  2. _UpgradePlatformToolsetFor_<safe_toolset_name> özelliği geçerli araç takımı için tanımlanır ve değeri geçerli araç takımına eşit değildir.

    Bu özellik adlarında, <safe_toolset_name>, alfasayısal olmayan karakterlerin tamamı bir alt çizgi (_) ile değiştirilmiş halde, araç takımı adını temsil eder.

Bir proje yükseltilebildiğinde, Çözüm Yönlendirme Ayarlamasıişlemine dahil olur. Daha fazla bilgi için bkz. IVsTrackProjectRetargeting2.

Projeler belirli bir araç takımını kullandığında Çözüm Gezgini proje adlarını donatmak istiyorsanız, bir _PlatformToolsetShortNameFor_<safe_toolset_name> özelliği tanımlayın.

_UpgradePlatformToolsetFor_<safe_toolset_name> ve _PlatformToolsetShortNameFor_<safe_toolset_name> özellik tanımları örnekleri için microsoft.cpp.default.props dosyasına bakın. Kullanım örnekleri için $(VCTargetPath)\Microsoft.Cpp.Platform.targets dosyasına bakın.

Özel proje yükseltici

Özel proje yükseltici nesnesi kullanmak için, burada gösterildiği gibi bir MEF bileşeni uygulayın:

/// </summary>
[Export("MyProjectUpgrader", typeof(IProjectRetargetHandler))]
[Export(typeof(IProjectRetargetHandler))]
[ExportMetadata("Name", "MyProjectUpgrader")]
[OrderPrecedence(20)]
[PartMetadata(ProjectCapabilities.Requires, ProjectCapabilities.VisualC)]

internal class MyProjectUpgrader: IProjectRetargetHandler
{
    // ...
}

Kodunuz varsayılan .vcxproj yükseltici nesnesini içeri aktarabilir ve çağırabilir:

// ...
[Import("VCDefaultProjectUpgrader")]
// ...
    IProjectRetargetHandler Lazy<IProjectRetargetHandler>
    VCDefaultProjectUpgrader { get; set; }
// ...

IProjectRetargetHandler Microsoft.VisualStudio.ProjectSystem.VS.dll tanımlanır ve IVsRetargetProjectAsyncile benzerdir.

Proje sistemine özel yükseltici nesnenizi kullanmasını bildirmek için VCProjectUpgraderObjectName özelliğini tanımlayın:

<PropertyGroup>
  <VCProjectUpgraderObjectName>MyProjectUpgrader</VCProjectUpgraderObjectName>
</PropertyGroup>

Proje yükseltmesini devre dışı bırakma

Proje yükseltmelerini devre dışı bırakmak için NoUpgrade değeri kullanın:

<PropertyGroup>
  <VCProjectUpgraderObjectName>NoUpgrade</VCProjectUpgraderObjectName>
</PropertyGroup>

Proje önbelleği ve genişletilebilirliği

Visual Studio 2017'de büyük C++ çözümleriyle çalışırken performansı geliştirmek için proje önbelleği kullanıma sunulmuştur. Proje verileriyle doldurulmuş bir SQLite veritabanı olarak uygulanır ve ardından MSBuild veya CPS projelerini belleğe yüklemeden projeleri yüklemek için kullanılır.

Önbellekten yüklenen .vcxproj projeleri için CPS nesnesi olmadığından, uzantının UnconfiguredProject veya ConfiguredProject içe aktaran MEF bileşenleri oluşturulamaz. Genişletilebilirliği desteklemek için, Visual Studio bir projenin MEF uzantılarını kullanıp kullanmadığını (veya kullanma olasılığının yüksek olduğunu) algıladığında proje önbelleği kullanılmaz.

Bu proje türleri her zaman tamamen yüklenir ve bellekte CPS nesneleri olduğundan, bunlar için tüm MEF uzantıları oluşturulur:

  • Başlangıç projeleri

  • Özel bir proje yükselticisi tanımlayan projeler, yani bir VCProjectUpgraderObjectName özelliği belirten projeler

  • Masaüstü Windows'u hedeflemeyen projeler, yani ApplicationType özelliği tanımlayanlar

  • Paylaşılan Öğeler projeleri (.vcxitems) ve .vcxitems projelerinin içeri aktarılmasıyla bunlara başvuran tüm projeler.

Bu koşullardan hiçbiri algılanırsa bir proje önbelleği oluşturulur. Önbellek, get arabirimlerindeki VCProjectEngine sorgularını yanıtlamak için gereken MSBuild projesindeki tüm verileri içerir. Bu, bir uzantı tarafından yapılan MSBuild props ve targets dosya düzeyindeki tüm değişikliklerin önbellekten yüklenen projelerde çalışması gerektiği anlamına gelir.

Uzantınızı gönderme

VSIX dosyaları oluşturma hakkında bilgi için bkz. Visual Studio Uzantılarını Gönderme. Özel yükleme konumlarına, örneğin $(VCTargetsPath)altına, dosya ekleme hakkında bilgi almak için, Uzantılar klasörünün dışına yükleme bölümüne bakın.

Ek kaynaklar

Microsoft Derleme Sistemi (MSBuild), proje dosyaları için derleme altyapısını ve genişletilebilir XML tabanlı biçimi sağlar. temel MSBuild kavramları ve Visual C++ için MSBuild'in Visual C++ proje sistemini genişletmek için nasıl çalıştığı hakkında bilgi sahibi olmanız gerekir.

Yönetilen Genişletilebilirlik Çerçevesi (MEF), CPS ve Visual C++ proje sistemi tarafından kullanılan uzantı API'lerini sağlar. MEF'in CPS tarafından nasıl kullanıldığına genel bakış için, VSProjectSystem'deki MEFgenel bakış bölümünde bulunan CPS ve MEF konusuna bakın.

Derleme adımları veya yeni dosya türleri eklemek için mevcut derleme sistemini özelleştirebilirsiniz. Daha fazla bilgi için bkz. MSBuild (Visual C++) Genel Bakış ve proje özellikleriyle çalışma.