Práce s Cíle

Přehled

Výuka: 10 min
Cvičení: 15 min
Otázky

  • Jak udělat cíle práce?

Cíle

  • Vědět, jak nastavit cíle,

  • Pochopit propojení a ROZHRANÍ vlastnosti

  • Make ROZHRANÍ, cíle,

Nyní víte, jak se sestavit jeden soubor pomocí tří řádků CMake. Ale co se stane, pokud mátevíce než jeden soubor se závislostmi? Musíte být schopni říct CMake o struktuře vašehoprojektu a pomůže vám ho postavit. K tomu budete potřebovat cíle.

už Jste viděli cíl:

add_executable(myexample simple.cpp)

To vytváří „spustitelný soubor“ target s názvem myexample. Cíl jména musí být unikátní (a existuje způsob, jak nastavit spustitelný jméno na něco jiného, než je cíl jméno pokud opravdu chcete).

cíle jsou podobně jako „objekty“ v jiných jazycích; mají vlastnosti (členské proměnné), kterédržené informace. Například vlastnost SOURCES bude mít simple.cpp.

Další typ cílového knihovna:

add_library(mylibrary simplelib.cpp)

můžete přidat klíčová slova STATICSHARED, nebo MODULE pokud víte, jaký druh knihovny chceš dělat; výchozí je trochu-„auto“ knihovna, která je uživatelsky nastavitelné pomocí BUILD_SHARED_LIBS.

můžete vytvořit i nestavěné knihovny. Více o tom později, jakmile uvidíme, co můžeme dělat s cíli.

Propojování

Jakmile budete mít několik cílů, lze popsat vztah mezi nimi starget_link_libraries a klíčového slova; jeden PUBLICPRIVATEINTERFACE. Nezapomeňte toto klíčové slovo při vytváření knihovny! CMake přejde do starého režimu kompatibility pro tento cílobecně rozbíjí věci.

knihovna my_lib, z my_lib.hppmy_lib.cpp. To vyžaduje alespoň c++14K kompilaci. Pokud přidáme my_exe, a je třeba my_lib by se, že síla my_exe compilewith C++14, nebo lepší?

odpověď

to závisí na hlavičce. Pokud hlavička obsahuje C++14, jedná se o veřejný požadavek – jak knihovna, tak uživatelé ji potřebují. Nicméně, pokud záhlaví je platná ve všech verzích C++, ajen implementace uvnitř my_lib.cpp vyžadují, C++14, pak je to PRIVATE požadavek

  • uživatelé nemusí být nucen do C++14 režim.

možná požadujete, aby uživatelé měli C++14, ale vaše knihovna může kompilovat s libovolnou verzí C++.To by byl INTERFACE požadavek.

Příklad Veřejných a Soukromých dědictví

Obrázek 1: Příklad veřejného, soukromého a rozhraní. myprogram vytvoří tři knihovny prostřednictvím mylibrary; soukromá knihovna to neovlivní.

na každém cíli jsou dvě kolekce vlastností, které mohou být vyplněny hodnotami;“ soukromé „vlastnosti řídí, co se stane při vytváření tohoto cíle, a“ interface “ propertiestell cíle spojené s tímto co dělat při vytváření. PUBLIC Klíčové slovo vyplní obě propertyfields současně.

Příklad 1: Zahrnout adresářů

Při spuštění , potom INCLUDE_DIRECTORIES vlastnost TargetAmydir připojena. Pokud místo toho použijete Klíčové slovoINTERFACE, pak se místo toho připojí INTERFACE_INCLUDE_DIRECTORIES. Pokud použijetePUBLIC, pak jsou obě vlastnosti připojeny současně.

příklad 2: C++ standard

existuje standardní vlastnost c++ – CXX_STANDARD. Můžete nastavit tuto vlastnost, a jako manyproperties v CMake, to dostane, je to výchozí hodnota z CMAKE_CXX_STANDARD proměnné pokud je nastaven,ale není tam žádné ROZHRANÍ verze – nelze vynutit CXX_STANDARD přes cíl. Co byste udělali, kdybyste měli cíl rozhraní C++11 a cíl rozhraní C++14 a byli propojeni s oběma?

mimochodem, existuje způsob, jak to zvládnout – můžete určit minimální funkce kompilace, které potřebujetekompilaci cíle; cxx_std_11 a podobné meta-rysy jsou ideální pro tento – vaše targetwill kompilace s alespoň nejvyšší úroveň specifikována, pokud CXX_STANDARD je nastaveno (a to je pěkné, jasné chybové pokud nastavíte CXX_STANDARD příliš nízké). target_compile_features může naplnitCOMPILE_FEATURESINTERFACE_COMPILE_FEATURES, stejně jako adresáře v příkladu 1.

Vyzkoušejte to

získejte toto úložiště a přejděte na příklad. Pokuste se napsat CMakeLists, které budou správně stavět.

git clone https://github.com/hsf-training/hsf-training-cmake-webpage.gitcd hsf-training-cmake-webpage/code/01-simple

soubory Zde jsou:

  • simple_lib.cpp: musí být kompilován sMYLIB_PRIVATE aMYLIB_PUBLIC definováno.
  • simple_example.cpp: Musí být sestaven s MYLIB_PUBLIC definováno, ale ne MYLIB_PRIVATE

Použít k nastavení definic na simple_lib.

Věcí, které můžete nastavit na cíle

  • target_link_libraries: Jiné cíle; může také projít názvů knihovny přímo
  • target_include_directories: Include directories
  • target_compile_features: The compiler features you need activated, like cxx_std_11
  • target_compile_definitions: Definitions
  • target_compile_options: More general compile flags
  • target_link_directories: Don’t use, give full paths instead (CMake 3.13+)
  • target_link_options: General link flags (CMake 3.13+)
  • target_sources: Add source files

See more commands here.

jiné typy cílů

můžete být opravdu opuštěni cíli a již plánujete, jak můžete popsat své programy z hlediska cílů. To je skvělé! Rychle se však dostanete do dalších dvou situacíkde je cílový jazyk užitečný, ale potřebujete nějakou extra flexibilitu oproti tomu, co jsme pokryli.

nejprve můžete mít knihovnu, která by koncepčně měla být cílem, ale ve skutečnosti nemá žádné vestavěné komponenty-knihovnu pouze pro záhlaví. Ty se nazývají knihovny rozhraní v CMake a youwould write:

add_library(some_header_only_lib INTERFACE)

Všimněte si, že nemusíte přidávat žádné zdrojové soubory. Nyní můžete nastavit INTERFACE vlastnosti pouze na tomto(protože neexistuje žádná vestavěná součást).

druhá situace je, pokud máte předem vytvořenou knihovnu, kterou chcete použít. Toto se nazývá animported library v CMake a používá klíčové slovo IMPORTED. Importované knihovny mohou být takéINTERFACE knihovny, mohou být postaveny a upraveny pomocí stejné syntaxe jako jiné knihovny (počínaje CMake 3.11), a mohou mít ve svém názvu ::ALIAS knihovny, které jednoduše pojmenují nějakou jinou knihovnu, mohou mít také ::). Většinu času budete importovániknihovny z jiných míst, a nebude dělat své vlastní.

rozhraní imported

a co INTERFACE IMPORTED?Rozdíl spočívá ve dvou věcech:

  1. IMPORTED cíle nejsou exportovatelné. Pokud cíle uložíte, importované cíle nelze uložit-je třeba je znovu vytvořit(nebo znovu najít).
  2. IMPORTED header include adresáře budou vždy označeny jako SYSTEM.

Proto IMPORTED cíl by mělo představovat něco, co není přímo součástí yourpackage.

Další čtení

  • Založené na Moderních CMake základy
  • Také vidět CMake je docs

Klíčové Body

  • Knihovny a spustitelné soubory jsou cíle.

  • cíle mají mnoho užitečných vlastností.

  • cíle mohou být spojeny s jiným cílem.

  • můžete určit, které části cíle se při propojení dědí.

  • místo vytváření proměnných můžete vytvářet cíle rozhraní.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.