Cmake și de a lucra cu dependențe

CMake vă permite să scrieți rapid și ușor scripturi de asamblare pentru asamblarea pe mai multe platforme a proiectelor software. Sub Windows, proiectele sunt generate pentru Visual Studio, pentru Linux - Makefiles. Alte medii de dezvoltare sunt de asemenea sprijinite.







Dar CMake vă permite, de asemenea, să conectați în mod convenabil dependențele (bibliotecile terților) la proiect. Și aici CMake oferă o serie de posibilități pe care vreau să le iau în considerare pe scurt.

Căutați biblioteci

Pentru a conecta o bibliotecă externă, cel puțin specificați calea spre fișierele antet și linkerul către bibliotecă (.lib So). CMake poate încerca să găsească aceste căi folosind comenzile find_path și find_library. care în forma cea mai simplă arata astfel:

Dacă fișierul numele imya_zagolovochnogo_fayla este găsit, atunci calea completă către directorul pentru a fi scrise variabila Var1 în cazul în care acest fișier este. Dacă numele fișierului nume-bibliotecă este găsit, variabila var2 va fi scris calea completă către fișierul.

După aceasta, aceste variabile pot fi conectate la ținta de asamblare:

Dar asta este exact unde CMake va face căutarea? Puteți specifica mai multe căi standard, de exemplu:

Acest lucru funcționează bine sub Linux, unde toate bibliotecile se află, de obicei, pe mai multe căi standard. În Windows este mai rău: biblioteca dorită poate fi localizată oriunde.

Puteți accepta că atunci când instalați biblioteca pe un computer, calea către aceasta va fi scrisă la variabila variabilă VOICE_DIRL. atunci CMake poate folosi aceasta:

Dacă nimic nu a ajutat, utilizatorul va trebui să introducă manual căile necesare în interfața CMake.

Simplificați căutarea

Pentru biblioteci complexe terțe, cu o grămadă de module și versiuni, este posibil să aveți nevoie de o grămadă mare de comenzi find_path și find_library. Pentru comoditate, aceste comenzi pot fi selectate într-un script separat numit FindBILL.cmake.

După aceasta, puteți apela scriptul cu comanda find_package:

(și nu uitați să alocați calea către directorul cu scripturi din variabila CMAKE_MODULE_PATH).

Acest lucru simplifică serios structura fișierului rădăcină CMakeLists.txt. De asemenea, pentru bibliotecile populare, există deja scripturi de căutare care sunt instalate cu CMake. Sub Linux, astfel de scripturi se află în folderul / usr / share / cmake / Modules. și sub Windows în folderul C: \ Program Files (x86) \ CMake \ share \ cmake-3.2 \ Module.

De asemenea, unele biblioteci oferă astfel de scripturi pentru a se găsi. În acest caz, trebuie să îl copiați în proiectul dvs. din depozitul bibliotecii terților.







Importați obiective de asamblare

În plus față de căile spre fișierele antet și biblioteci, sunt necesare informații despre opțiunile de compilator, definiții de preprocesor, dependențe de dependență etc. Ar fi convenabil să lucrați cu biblioteci terțe ca și cu obiectivele normale de construire.

CMake permite acest lucru. Pentru a face acest lucru, creați un obiectiv "virtual" de construcție și descrieți proprietățile acestuia. În terminologia CMake, această țintă de asamblare se numește importată.

Puteți crea și descrie ținta de asamblare importată utilizând cuvântul cheie IMPORTAT. exemplu:

După aceasta, puteți conecta această țintă de asamblare externă la obiectivul nostru:

La construirea proiectului nostru, căile spre fișierele antet și biblioteca vor fi înregistrate automat, se va defini preprocesorul. Această metodă este o alternativă la utilizarea funcțiilor find_library și find_path.

Descrierea destinației de adunare importată poate fi plasată convenabil într-un script separat. Dar este mai bine dacă biblioteca externă generează acest script pentru noi. Iată cum să generați automat un astfel de script.

Apoi, proiectul nostru va fi de ajuns pentru a conecta scriptul gata:

Asamblarea dependențelor

Dar ce se întâmplă dacă dependența necesară nu este instalată în sistem? Puteți solicita utilizatorului să îl instaleze sau să îl încredințeze în scriptul CMake.

Există 2 strategii principale în funcție de dimensiunea bibliotecii externe.

Codul sursă pentru o mică bibliotecă poate fi adăugat pur și simplu copacului sursă al proiectului nostru, de exemplu, la un subfolder 3rdParty. Apoi puteți monta biblioteca din fișierul rădăcină CMakeLists.txt cu comanda add_subdirectory:

Apoi, această bibliotecă va fi compilată împreună cu proiectul nostru, iar obiectivele sale de asamblare vor fi disponibile.

Dacă biblioteca externă este prea mare, puteți utiliza comanda ExternalProject_Add. De exemplu:

Comanda are mulți parametri. Vă permite să descărcați arhiva de pe Internet și să o despachetați sau să clonați depozitul, să apelați o instanță separată de CMake pentru a crea proiecte Visual Studio sau Makefiles. O astfel de combinație multifuncțională.

Cu toate acestea, echipa are dezavantaje. Problema este că biblioteca externă este configurată și asamblată nu la momentul ExternalProject_Add. Ele apar simultan cu ansamblul proiectului nostru, și, astfel, înainte de asamblarea unor biblioteci în sine, nici fișiere antet sau script-uri nu există. Și asta înseamnă că comenzile find_library. find_path va genera erori când este configurat în CMake. Scopurile construirii unei biblioteci externe vor fi indisponibile ...

Prin urmare, comanda ExternalProject_Add nu este un panaceu și ar trebui folosită cu prudență.

Super asamblare

În discuțiile pe Internet, am întâlnit o abordare a construirii unui proiect bazat pe ExternalProject_Add. care a fost numită "super-colecție".

Ideea este că ambele biblioteci terțe și proiectul nostru sunt colectate folosind ExternalProject_Add. CMakeLists.txt rădăcină pur și simplu conține apeluri la această comandă și asta este.

În acest caz, descărcarea și configurarea au loc în timpul construcției. Când sunăm comanda de creare sub Linux sau rulați ansamblul în Visual Studio sub Windows, se întâmplă următoarele:

  1. Biblioteca externă este descărcată, configurată, colectată și instalată.
  2. Proiectul nostru este configurat (acum find_library. Find_path funcționează fără erori, deoarece biblioteca externă există deja fizic) și se întâmplă.






Articole similare

Trimiteți-le prietenilor: