При оглядывании в сети я видел много кода как это:
include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2)
target_include_directories(app SYSTEM PUBLIC ${SDL2_INCLUDE_DIRS}
target_link_libraries(app ${SDL2_LIBRARIES})
Однако это, кажется, неправильный путь о выполнении его, поскольку это только использует включать каталоги и библиотеки, но проигнорированный определяет, пути к библиотеке и другие флаги, которые могли бы быть возвращены pkg-config
.
Что было бы корректным способом сделать это и гарантировать что вся компиляция и флаги ссылки, возвращенные pkg-config
используются скомпилированным app
? И есть ли единственная команда для выполнения этого, т.е. чего-то как target_use(app SDL2)
?
касательно:
Другие методы, которые, как замечают ниже сбоя, настраивали пути компоновщика для тех общих библиотек, которые не найдены под типичными установленными местоположениями (такими как/usr/lib) получающуюся ошибку компоновщика, были /usr/bin/ld: cannot find -llibrary-1.0
. Для моего случая pkg-файлы-конфигурации не были установлены также, и пути pkg-конфигурации для проекта были добавлены с помощью переменной среды PKG_CONFIG_PATH. Это - изложенная кратко версия рабочего CMakeLists.txt:
cmake_minimum_required(VERSION 3.14)
project(ya-project C)
find_package(PkgConfig REQUIRED)
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
PkgConfig::MY_PKG
PkgConfig::YOUR_PKG)
Большинству доступных ответов не удается настроить заголовки для pkg-config
библиотека. После размышления на Документация для FindPkgConfig я предложил решение, которое предоставляет им также:
include(FindPkgConfig)
if(NOT PKG_CONFIG_FOUND)
message(FATAL_ERROR "pkg-config not found!" )
endif()
pkg_check_modules(<some-lib> REQUIRED IMPORTED_TARGET <some-lib>)
target_link_libraries(<my-target> PkgConfig::<some-lib>)
( Замена Ваша цель вместо <my-target>
и безотносительно библиотеки вместо <some-lib>
, соответственно. )
IMPORTED_TARGET
опция, кажется, является ключевой и делает все затем avaiable под PkgConfig::
пространство имен. Это было всем, что требовалось и также все, что должно требоваться.