Jeśli używasz cmake i pkg-config w całkiem normalny sposób, to rozwiązanie działa.
Jeśli jednak masz bibliotekę, która istnieje w jakimś katalogu programistycznym (takim jak / home / me / hack / lib), to użycie innych metod opisanych tutaj nie spowoduje skonfigurowania ścieżek konsolidatora. Biblioteki, które nie zostały znalezione w typowych lokalizacjach instalacji, spowodowałyby błędy konsolidatora, takie jak /usr/bin/ld: cannot find -lmy-hacking-library-1.0
. To rozwiązanie naprawia błąd konsolidatora w tym przypadku.
Innym problemem może być to, że pliki pkg-config nie są instalowane w normalnym miejscu, a ścieżki pkg-config dla projektu muszą zostać dodane przy użyciu zmiennej środowiskowej PKG_CONFIG_PATH podczas działania cmake (zobacz inne pytania dotyczące przepełnienia stosu). Zakładając, że masz skonfigurowaną poprawną ścieżkę pkg-config, to rozwiązanie również rozwiązuje ten problem.
Rozwiązanie sprowadza się do tej ostatecznej wersji działającego CMakeLists.txt:
cmake_minimum_required(VERSION 3.14)
project(ya-project C)
# the `pkg_check_modules` function is created with this call
find_package(PkgConfig REQUIRED)
# these calls create special `PkgConfig::<MODULE>` variables
pkg_check_modules(MY_PKG REQUIRED IMPORTED_TARGET any-package)
pkg_check_modules(YOUR_PKG REQUIRED IMPORTED_TARGET ya-package)
add_executable(program-name file.c ya.c)
target_link_libraries(program-name PUBLIC
PkgConfig::MY_PKG
PkgConfig::YOUR_PKG)
Zauważ, że target_link_libraries
robi coś więcej niż tylko zmianę poleceń konsolidatora. Propaguje również inne właściwości PUBLIC określonych celów, takie jak: flagi kompilatora, definicje kompilatora, ścieżki dołączania itp.
IMPORTED_TARGET
wymaga CMake 3.6 lub nowszej.