Portál AbcLinuxu, 6. května 2025 16:36

Dotaz: cmake add_subdirectory

14.12.2021 14:54 pou | skóre: 18
cmake add_subdirectory
Přečteno: 296×
Odpovědět | Admin
Dobrý den,

vytvářím nový projekt, který ke své činnosti potřebuje externí knihovnu.

Knihovna využívá ke generování Makefilu CMake, knihovna jde bez problému sestavit.

Vytvořím si tedy nový projekt (hello), kde v cmaku přidám cmake z externí knihovny pomocí add_subdirectory.

Cíl je asi jasný - nejprve zkompilovat knihovnu potom program hello.

Po přidání externí knihovny se mi však nedaří projekt zkonfigurovat, cmake hlásí chybu že nenalezl konfigurační soubory Cmaku, které jsou umístěny v adresaři "cmake" v externí knihovně (jedná se patrně o rozšíření funkcionality cmaku - v tomto adresáři jsou soubory např. FindUSB1.cmake, FindConfuse.cmake atd.). Pokud adresář cmake, přesunu z adresáře externí knihovny výše (do projektu hello), chyba zmizí a objeví se další....

Otázka tedy zní: Jak správně přidat podřízený projekt do CMaku, tak aby cmake načítal skripty ze správného adresáře?

Ještě jednou připomínám, že pokud zkusím cmake přímo v adresáři s externí knihovnou vše bez problému jde.

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.12.2021 18:44 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: cmake add_subdirectory
Odpovědět | | Sbalit | Link | Blokovat | Admin
Povedzme, že máš takúto štruktúru
hello/main.c
hello/CMakeLists.txt
hello/kniznica/kniznica.c
hello/kniznica/CMakeLists.txt
hello/kniznica/CMakeLists.txt obsahuje
add_library(kniznica SHARED kniznica.c)
hello/CMakeLists.txt obsahuje
add_subdirectory(kniznica)
a mal by tiež obsahovať
add_executable(hello main.c)
target_link_libraries(hello PRIVATE kniznica)
Build potom urobím:
rm -rf build
mkdir build
cd build
cmake ..
make
Kvoli target_link_libraries() cmake bude vedieť, že na zbuildovanie "hello" potrebuje "kniznica" a keďže existuje target s menom kniznica, tak najprv zbuilduje ten.
14.12.2021 19:27 pou | skóre: 18
Rozbalit Rozbalit vše Re: cmake add_subdirectory
Děkuji za reakci, ano struktura je jak píšete,

jen v té knihovně je podadresář cmake ve kterem jsou různé skrypty které, pokud zavolám cmake na muj hello (stejně jak píšete) vypíše chybu, že nemůže najít právě ty skripty.

struktura cca:
hello/main.c
hello/CMakeLists.txt
hello/kniznica/kniznica.c
hello/kniznica/CMakeLists.txt
hello/kniznica/CMakeOptions.txt
hello/kniznica/cmake/FindConfuse.cmake
hello/kniznica/cmake/...
jinak jde o tuto knihovnu, kdyby to bylo důležité
14.12.2021 19:58 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: cmake add_subdirectory
Podľa mňa tie súbory v adresári cmake sú súbory, ktoré cmake môže použiť na to, aby zafungovalo find_package().

Pokiaľ to ftdl ponúka tvoja distribúcia, tak by som dal do OS nainštalovať to. Tým by sa malo zariadiť, že ku knižnici sa nainštalujú aj súbory potrebné na to, aby tú knižnicu vedel nájsť cmake pri kompilovaní programov, ktoré tú knižniciu potrebujú.

Ak ftdl tvoja distribúcia neponúka, tak by som som skúsil ftdl skompilovať samostatne - asi s
cmake -DCMAKE_INSTALL_PREFIX=/usr ..; sudo make install
14.12.2021 21:42 pou | skóre: 18
Rozbalit Rozbalit vše Re: cmake add_subdirectory
jak jsem psal v úvodu: Pokud zkusím cmake přímo v adresáři s externí knihovnou vše bez problému jde.

Potom samozřejmě můžu svůj hello program linkovat a vše funguje.

Chtěl jsem ale mít vše pohromadě - tedy kompilaci knihovny a programu, bez nutnosti instalace (make install) knihovny do systému.

Ano můžu zkompilovat knihovnu do nějakého adresaře a potom kompilovat program s přidáním tohoto adresaře do linkeru,,,, ale jaksi to není to co jsem chtěl -> jeden cmake, který zkompiluje jak knihovnu tak program, pak třeba použiji jinou verzi knihovny a znovu....

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.