Sdílet prostřednictvím


Návod: Import knihoven STL jako jednotek hlaviček

Tento názorný postup ukazuje, jak importovat knihovny STL (Standard Template Library) jazyka C++ jako jednotky hlaviček v sadě Visual Studio. Ještě rychlejší a robustnější způsob importu standardní knihovny najdete v tématu Kurz: Import standardní knihovny C++ pomocí modulů.

Import hlavičky STL jako jednotky záhlaví je jednodušší než použití předkompilovaných souborů hlaviček. Jednotky hlaviček se snadněji nastavují a používají, jsou podstatně menší na disku, poskytují podobné výhody výkonu a jsou flexibilnější než sdílené PCH.

Podrobnější informace o tom, jaké jednotky záhlaví jsou a jaké výhody poskytují, najdete v tématu Co je jednotka záhlaví?. Pokud chcete porovnat jednotky záhlaví s jinými způsoby importu standardní knihovny, přečtěte si téma Porovnání jednotek záhlaví, modulů a předkompilovaných hlaviček.

Požadavky

Pokud chcete použít jednotky hlaviček, použijte Visual Studio 2022 nebo novější nebo Visual Studio 2019 verze 16.11 nebo novější. K /std:c++20 použití jednotek záhlaví se vyžaduje možnost (nebo novější).

Dva přístupy k importu hlaviček STL jako jednotek hlaviček

Než budete moct importovat hlavičku STL, musí se zkompilovat do jednotky záhlaví. Jednotka záhlaví je binární reprezentace souboru hlavičky. Má .ifc rozšíření.

Doporučeným přístupem je vytvoření statické knihovny, která obsahuje vytvořené jednotky hlaviček pro hlavičky STL, které chcete použít. Pak na danou knihovnu a import její jednotky záhlaví odkazujte. Tento přístup může vést k rychlejším sestavením a lepšímu opakovanému použití. Pokud chcete vyzkoušet tento přístup, přečtěte si téma Přístup 1: Vytvoření statické knihovny jednotek hlaviček knihovny STL.

Dalším přístupem je vyhledání hlaviček #include STL v projektu v sadě Visual Studio, jejich kompilace do jednotek hlaviček a import nikoli #include těchto hlaviček. Tento přístup je užitečný, pokud máte velký základ kódu, protože nemusíte měnit zdrojový kód. Tento přístup je méně flexibilní než přístup statické knihovny, protože se nedá znovu použít předdefinované jednotky hlaviček v jiných projektech. Stále ale získáte výhodu výkonu při importu jednotlivých knihoven STL jako jednotek hlaviček. Pokud chcete vyzkoušet tento přístup, přečtěte si téma Přístup 2: Kontrola obsahuje hlavičky STL, které se mají importovat.

Přístup 1: Vytvoření statické knihovny jednotek hlaviček knihovny STL

Doporučeným způsobem, jak využívat knihovny STL, protože jednotky hlaviček jsou vytvoření jednoho nebo více statických projektů knihovny. Tyto projekty by se měly skládat z jednotek hlaviček knihovny STL, které chcete použít. Pak na projekty knihovny odkazujte, abyste tyto jednotky hlaviček STL spotřebovali. Je to podobné použití sdílených předkompilovaných hlaviček, ale jednodušší.

Jednotky záhlaví (a moduly) integrované v projektu statické knihovny jsou automaticky dostupné pro odkazování na projekty, protože systém projektu automaticky přidá do kompilátoru příslušnou /headerUnit možnost příkazového řádku, aby odkazování na projekty mohly importovat jednotky záhlaví.

Tento přístup zajišťuje, že se jednotka záhlaví pro konkrétní hlavičku sestaví jenom jednou. Umožňuje importovat některé nebo všechny jednotky záhlaví, které není možné s PCH. Jednotky záhlaví můžete zahrnout v libovolném pořadí.

V následujícím příkladu vytvoříte projekt statické knihovny skládající se z <iostream> jednotek záhlaví a <vector> jednotek záhlaví. Po sestavení řešení budete odkazovat na tento projekt sdílené jednotky hlaviček z jiného projektu C++. import <iostream>; Všude nebo import <vector>; je nalezena integrovaná jednotka záhlaví pro tuto knihovnu místo překladu hlavičky s preprocesorem. Zlepšuje výkon sestavení, například soubory PCH, když je stejná hlavička zahrnuta do více souborů. Hlavička nebude muset zpracovávat soubory, které ji obsahují. Místo toho se naimportuje již zpracovaná zkompilovaná jednotka hlaviček.

Chcete-li vytvořit statickou knihovnu, která obsahuje knihovny <iostream> STL, a <vector>postupujte takto:

  1. Vytvořte prázdný projekt C++. Pojmenujte ho SharedPrj.
    Z typů projektů dostupných v okně Vytvořit nový projekt vyberte prázdný projekt pro jazyk C++:Screenshot that shows creating a new empty C++ project.

  2. Přidejte do projektu nový soubor C++. Změňte obsah souboru na:

    import <iostream>;
    import <vector>;
    

Nastavení vlastností projektu

Nastavte vlastnosti projektu tak, aby sdílely jednotky záhlaví z tohoto projektu:

  1. V hlavní nabídce sady Visual Studio vyberte Vlastnosti projektu>SharedPrj a otevřete dialogové okno Stránky vlastností projektu:Screenshot that shows settings for Configuration Type and C++ Language Standard.
  2. V rozevíracím seznamu Konfigurace vyberte Všechny konfigurace a potom v rozevíracím seznamu Platformy vyberte Všechny platformy. Tato nastavení zajišťují, že vaše změny budou platit bez ohledu na to, jestli vytváříte ladění nebo vydání.
  3. V levém podokně dialogového okna Stránky vlastností projektu vyberte Obecné vlastnosti>konfigurace.
  4. Změňte možnost Typ konfigurace na Statickou knihovnu (.lib).
  5. Změňte jazyk C++ Standard na ISO C++20 Standard (/std:c++20) (nebo novější).
  6. V levém podokně dialogového okna Stránky vlastností projektu vyberte Vlastnosti>konfigurace C/C++>Obecné.
  7. V rozevíracím seznamu Vyhledat zdroje závislostí modulů vyberte Ano. (Tato možnost způsobí, že kompilátor zkontroluje závislosti, které je možné integrovat do jednotek hlaviček: Screenshot that shows the scan module dependencies property setting.
  8. Kliknutím na tlačítko OK zavřete dialogové okno Stránky vlastností projektu. Řešení sestavíte tak, že v hlavní nabídce vyberete Sestavit>řešení.

Odkaz na knihovnu jednotek záhlaví

Pokud chcete importovat <iostream> a <vector> jako jednotky záhlaví ze statické knihovny, vytvořte projekt, který odkazuje na statickou knihovnu následujícím způsobem:

  1. Pokud je aktuální řešení stále otevřené, v nabídce sady Visual Studio vyberte Soubor>přidat>nový projekt.

  2. V průvodci vytvořením nového projektu vyberte šablonu konzolové aplikace C++ a zvolte Další.

  3. Pojmenujte nový projekt Návod. Změňte rozevírací seznam Řešení na Přidat do řešení. Zvolte Vytvořit , abyste projekt vytvořili a přidali ho do svého řešení.

  4. Obsah zdrojového souboru Walkthrough.cpp změňte následujícím způsobem:

    import <iostream>;
    import <vector>;
    
    int main()
    {
        std::vector<int> numbers = {0, 1, 2};
        std::cout << numbers[1];
    }
    

Jednotky záhlaví vyžadují /std:c++20 možnost (nebo novější). Nastavte jazykový standard pomocí následujícího postupu:

  1. V Průzkumník řešení klikněte pravým tlačítkem myši na projekt Návod a výběrem možnosti Vlastnosti otevřete dialogové okno Stránky vlastností projektu:Screenshot that shows setting the language standard to the preview version.
  2. V levém podokně dialogového okna Stránky vlastností projektu Návod vyberte Vlastnosti>konfigurace Obecné.
  3. V rozevíracím seznamu Standard jazyka C++ vyberte ISO C++20 Standard (/std:c++20) (nebo novější).
  4. Kliknutím na tlačítko OK zavřete dialogové okno Stránky vlastností projektu.

V projektu Návod přidejte odkaz na projekt SharedPrj pomocí následujících kroků:

  1. V projektu Návod vyberte uzel Odkazy a pak vyberte Přidat odkaz. V seznamu projektů vyberte SharedPrj : Screenshot that shows the Add Reference dialog. It's used to add a reference to the Walkthrough project. Přidání tohoto odkazu způsobí, že systém sestavení použije jednotky hlaviček vytvořené funkcí SharedPrj , kdykoli import v projektu Návod odpovídá jedné z předdefinovaných jednotek hlaviček v SharedPrj.
  2. Kliknutím na TLAČÍTKO OK zavřete dialogové okno Přidat odkaz.
  3. Klikněte pravým tlačítkem myši na projekt Návod a vyberte Nastavit jako spouštěný projekt.
  4. Sestavte řešení. (Použít Sestavení>řešení v hlavní nabídce.) Spusťte ho, abyste viděli, že vytváří očekávaný výstup: 1

Výhodou tohoto přístupu je, že můžete odkazovat na projekt statické knihovny z libovolného projektu a znovu použít v něm jednotky záhlaví. V tomto příkladu obsahuje <vector> statická knihovna jednotky a <iostream> jednotky záhlaví.

Můžete vytvořit monolitický statický projekt knihovny, který obsahuje všechny běžně používané hlavičky STL, které chcete importovat z různých projektů. Nebo můžete vytvořit menší projekty sdílených knihoven pro různé seskupení knihoven STL, které chcete importovat jako jednotky hlaviček. Podle potřeby pak na tyto projekty sdílených jednotek hlaviček odkazujte.

Výsledkem by měla být zvýšená propustnost sestavení, protože import jednotky hlaviček výrazně snižuje práci, které musí kompilátor provést.

Pokud tento přístup použijete u vlastních projektů, sestavte projekt statické knihovny s možnostmi kompilátoru, které jsou kompatibilní s projektem, který na něj odkazuje. Projekty STL by například měly být sestaveny s možností kompilátoru /EHsc , aby se zapnulo zpracování výjimek, a proto by projekty, které odkazují na projekt statické knihovny.

Použití /translateInclude

Možnost /translateInclude kompilátoru (dostupná v dialogovém okně Stránky vlastností projektu v části C/C++>General>Translate Includes to Imports) usnadňuje použití knihovny jednotek hlaviček ve starších projektech, které #include knihovny STL. Díky tomu není nutné měnit #include direktivy v import projektu, ale zároveň vám dává výhodu importu jednotek záhlaví místo jejich zahrnutí.

Pokud máte například v projektu a odkazujete #include <vector> na statickou knihovnu, která obsahuje jednotku <vector>záhlaví, nemusíte ve zdrojovém kódu ručně měnit #include <vector>import <vector>; . Místo toho kompilátor automaticky považuje #include <vector>import <vector>;za . Další informace o tomto přístupu najdete v tématu Přístup 2: Kontrola obsahuje hlavičky STL k importu. Ne všechny soubory hlaviček STL je možné zkompilovat do jednotky hlaviček. Dodávaná header-units.json se sadou Visual Studio uvádí, které soubory hlaviček STL je možné zkompilovat do jednotek hlaviček. Hlavička, která spoléhá na makra k určení jejího chování, se často nedá zkompilovat do jednotky záhlaví.

Příkaz #include , který neodkazuje na jednotku záhlaví, je považován za normální #include.

Opakované použití jednotek hlaviček mezi projekty

Jednotky záhlaví vytvořené projektem statické knihovny jsou automaticky dostupné pro všechny přímo a nepřímo odkazující na projekty. Existují nastavení projektu, která umožňují vybrat jednotky záhlaví, které mají být automaticky dostupné pro všechny odkazující projekty. Nastavení jsou v nastavení projektu v adresářích VC++.

  1. V Průzkumník řešení klikněte pravým tlačítkem myši na projekt a vyberte Vlastnosti a otevřete dialogové okno Stránky vlastností projektu.
  2. V levém podokně dialogového okna vyberte Adresáře VC++ Vlastnosti>konfigurace:Screenshot that shows public project content properties, like Public Include Directories and All Header Files are Public.

Následující vlastnosti řídí viditelnost jednotek záhlaví do systému sestavení:

  • Adresáře veřejných zahrnutí určují adresáře projektu pro jednotky hlaviček, které by se měly automaticky přidat do cesty zahrnutí do odkazů na projekty.
  • Veřejné adresáře modulů C++ určují, které adresáře projektů obsahují jednotky hlaviček, které by měly být k dispozici pro odkazování na projekty. Tato vlastnost umožňuje nastavit několik jednotek záhlaví jako veřejné. Je viditelný pro jiné projekty, takže sem vložte jednotky záhlaví, které chcete sdílet. Pokud toto nastavení použijete pro usnadnění práce, zadejte veřejné adresáře include, aby se do cesty Include automaticky přidaly veřejné hlavičky do cesty Include v odkazujících projektech.
  • Všechny moduly jsou veřejné: pokud používáte jednotky hlaviček vytvořené jako součást projektu knihovny DLL, musí být symboly exportovány z knihovny DLL. Pokud chcete exportovat symboly modulu automaticky, nastavte tuto vlastnost na Ano.

Použití předem vytvořeného souboru modulu

Nejjednodušší způsob, jak použít jednotky hlaviček mezi řešeními, je obvykle odkazovat na projekt sdílené jednotky hlaviček z každého řešení.

Pokud musíte použít integrovanou jednotku záhlaví, pro kterou nemáte projekt, můžete určit, kde je sestavený .ifc soubor, abyste ho mohli importovat do svého řešení. Přístup k tomuto nastavení:

  1. V hlavní nabídce vyberte Vlastnosti projektu>a otevřete tak dialogové okno Stránky vlastností projektu.
  2. V levém podokně dialogového okna vyberte Vlastnosti>konfigurace C/C++>Obecné.
  3. V části Další závislosti modulů přidejte moduly, které chcete odkazovat, oddělené středníky. Tady je příklad formátu, který se má použít pro další závislosti modulů: ModuleName1=Path\To\ModuleName1.ifc; ModuleName2=Path\To\ModuleName2.ifcScreenshot showing project Property Pages properties under Configuration Properties, C/C++, General, with Additional Module Dependencies selected.

Výběr mezi několika kopiemi jednotky záhlaví

Pokud odkazujete na projekty, které sestavují více jednotek záhlaví, buď se stejným názvem, nebo pro stejný soubor záhlaví, musíte určit, který z nich se má použít. Můžete mít různé verze jednotky hlaviček vytvořené s různými nastaveními kompilátoru, a musíte zadat verzi, která odpovídá vašemu nastavení projektu.

Pomocí vlastnosti Další závislosti jednotek hlaviček projektu můžete vyřešit kolize zadáním jednotky hlavičky, kterou chcete použít. Jinak není možné předpovědět, který z nich se vybere.

Nastavení vlastnosti Další závislosti jednotek hlaviček:

  1. V hlavní nabídce vyberte Vlastnosti projektu>a otevřete tak dialogové okno Stránky vlastností projektu.
  2. V levém podokně dialogového okna vyberte Vlastnosti>konfigurace C/C++>Obecné.
  3. Určete, které moduly nebo soubory jednotek hlaviček se mají použít v dalších závislostech jednotek hlaviček k vyřešení kolizí. Tento formát použijte pro další závislosti jednotek hlaviček: Path\To\Header1.h= Path\To\HeaderUnit1.ifc;Path\To\Header2.h= Path\To\ HeaderUnit2.ifcScreenshot that shows the Additional Header Unit Dependencies setting in the project Property Pages dialog.

Důležité

Ujistěte se, že projekty, které sdílejí jednotky záhlaví, jsou sestavené s kompatibilními možnostmi kompilace. Pokud při implementaci jednotky hlaviček, které se liší od těch, které jste použili při vytváření, použijete možnosti kompilace, kompilátor vydá upozornění.

Poznámka

Chcete-li použít jednotky hlaviček vytvořené jako součást projektu knihovny DLL, nastavte všechny moduly jsou veřejné na Ano.

Přístup 2: Kontrola obsahuje hlavičky STL pro import

Dalším způsobem importu knihoven STL je vyhledání hlaviček #include STL v projektu v sadě Visual Studio a jejich kompilace do jednotek hlaviček. Kompilátor pak importuje místo zahrnutí těchto hlaviček.

Tato možnost je vhodná, když projekt obsahuje mnoho souborů hlaviček STL v mnoha souborech nebo když propustnost sestavení není kritická. Tato možnost nezaručuje, že jednotka záhlaví pro určitý soubor záhlaví je sestavena pouze jednou. Je ale užitečné, pokud máte velký základ kódu: Nemusíte měnit zdrojový kód, abyste využili výhod jednotek hlaviček pro mnoho knihoven STL, které používáte.

Tento přístup je méně flexibilní než přístup statické knihovny, protože se nedá použít k opětovnému použití integrovaných jednotek hlaviček v jiných projektech. Tento přístup nemusí být vhodný pro větší projekty: Nezaručuje optimální čas sestavení, protože všechny zdroje musí být prohledány pro #include příkazy.

Ne všechny soubory hlaviček se dají automaticky převést na jednotky záhlaví. Například hlavičky, které závisí na podmíněné kompilaci prostřednictvím maker, by neměly být převedeny na jednotky záhlaví. Ve formě header-units.jsonsouboru pro hlavičky STL, které kompilátor používá při /translateInclude zadání, obsahuje seznam povolených. Určuje, které hlavičky STL lze zkompilovat do jednotek hlaviček. Soubor header-units.json je v instalačním adresáři pro Visual Studio. Například, %ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.30.30705\include\header-units.json. Pokud soubor záhlaví STL není v seznamu, považuje se za normální #include místo importu jako jednotky záhlaví. Další výhodou header-units.json souboru je, že brání duplikaci symbolů v integrovaných jednotkách záhlaví. To znamená, že pokud kompilace jednotky záhlaví vícekrát přenese do jiné hlavičky knihovny, symboly nebudou duplikovány.

Pokud chcete tento přístup vyzkoušet, vytvořte projekt, který obsahuje dvě knihovny STL. Potom změňte vlastnosti projektu tak, aby importoval knihovny jako jednotky záhlaví místo nich, jak je popsáno v další části.

Vytvoření projektu aplikace konzoly C++

Pomocí těchto kroků vytvořte projekt, který obsahuje dvě knihovny STL: <iostream> a <vector>.

  1. V sadě Visual Studio vytvořte nový projekt konzolové aplikace C++.

  2. Obsah zdrojového souboru nahraďte následujícím způsobem:

    #include <iostream>;
    #include <vector>;
    
    int main()
    {
        std::vector<int> numbers = {0, 1, 2};
        std::cout << numbers[1];
    }
    

Nastavení možností projektu a spuštění projektu

Následující kroky nastavují možnost, která způsobí, že kompilátor vyhledá zahrnuté hlavičky, aby se přeložily do jednotek hlaviček. Nastavují také možnost, která způsobí, že kompilátor bude považovat #include za soubory import hlaviček, které lze považovat za jednotky hlaviček.

  1. V hlavní nabídce vyberte Vlastnosti projektu>a otevřete tak dialogové okno Stránky vlastností projektu.
  2. V rozevíracím seznamu Konfigurace vyberte Všechny konfigurace a potom v rozevíracím seznamu Platformy vyberte Všechny platformy. Tato nastavení zajistí, že vaše změny budou platit bez ohledu na to, jestli vytváříte ladění nebo vydávání, a další konfigurace.
  3. V levém podokně dialogového okna vyberte Vlastnosti>konfigurace C/C++>Obecné.
  4. Nastavte zdroje kontroly pro závislosti modulů na ano. Toto nastavení zajistí, že se všechny kompatibilní soubory hlaviček zkompilují do jednotek hlaviček.
  5. Nastavte možnost Přeložit zahrnutí na hodnotu Ano. Toto nastavení zkompiluje soubory hlaviček STL uvedené v header-unit.json souboru jako jednotky hlaviček a pak je naimportuje místo použití preprocesoru.#include Screenshot that shows the scan module dependencies property setting in the project Property Pages.
  6. Chcete-li uložit změny, zvolte OK a zavřete dialogové okno Stránky vlastností projektu.

Možnost /std:c++20 nebo novější je nutná k použití jednotek záhlaví. Změna jazykového standardu jazyka C++ používaného kompilátorem:

  1. V hlavní nabídce vyberte Vlastnosti projektu>a otevřete tak dialogové okno Stránky vlastností projektu.
  2. V rozevíracím seznamu Konfigurace vyberte Všechny konfigurace a potom v rozevíracím seznamu Platformy vyberte Všechny platformy. Tato nastavení zajistí, že vaše změny budou platit bez ohledu na to, jestli vytváříte ladění nebo vydávání, a další konfigurace.
  3. V levém podokně dialogového okna Stránky vlastností projektu vyberte Obecné vlastnosti>konfigurace.
  4. V rozevíracím seznamu Standard jazyka C++ vyberte ISO C++20 Standard (/std:c++20) (nebo novější).
  5. Chcete-li uložit změny, zvolte OK a zavřete dialogové okno Stránky vlastností projektu.
  6. V hlavní nabídce sestavte řešení tak, že vyberete Sestavit>řešení.

Spuštěním řešení ověřte, že vytváří očekávaný výstup: 1

Hlavním aspektem, jestli tento přístup použít, je vyvážení mezi pohodlím a náklady na prohledávání všech souborů, abyste zjistili, které soubory hlaviček se mají sestavit jako jednotky hlaviček.

Viz také

Porovnání jednotek záhlaví, modulů a předkompilovaných hlaviček
Kurz: Import standardní knihovny C++ pomocí modulů
Návod: Sestavení a import jednotek hlaviček v projektech Visual C++
/translateInclude